2009-09-23 20 views
12

Potrzebuję zastosować zapytanie SQL do plików CSV (pliki tekstowe rozdzielane przecinkami). Mój SQL jest predefiniowany z innego narzędzia i nie może się zmienić. Może zawierać osadzone selekcje i aliasy tabel w części OD.Wykonywanie SQL na plikach CSV za pośrednictwem JDBC

Dla mojego zadania Znalazłem dwa open-source (jest to wymóg projektu) biblioteki, które zapewniają JDBC sterowniki:

  1. CsvJdbc
  2. XlSQL
  3. JBoss Teiid
  4. Załóż Apache Derby DB, załaduj wszystkie pliki CSV jako tabele i wykonaj zapytanie.

Są to problemy napotkane I:

  1. nie akceptuje składni SQL (używa wewnętrznych wybiera i aliasy tabela). Co więcej, nie był on utrzymywany od 2004 roku.
  2. Nie mogłem go uruchomić, ponieważ ma on jako zależność parser SAX, który powoduje wyjątek podczas analizowania innych dokumentów. Podobnie, brak zmian od 2004.
  3. Nie sprawdziłem, czy obsługuje składnię, ale wydaje się, jak narzut. Wymaga zdefiniowania kilku jednostek (Virtual Databases, Bindings). Z listy mailingowej powiedzieli mi, że ostatnia wersja obsługuje tworzenie wymaganych obiektów przez środowisko wykonawcze. Czy ktokolwiek użył go do tak prostego zadania (zwykle może łączyć się z kilkoma typami danych, takimi jak CSV, XML lub inny DBS i tworzyć wirtualny, zunifikowany)?
  4. Czy można to łatwo zrobić?

Z 4 rzeczy, które rozważałem/wypróbowałem, tylko 3 i 4 wydają mi się opłacalne. Wszelkie porady na ten temat lub w inny sposób, w jaki mogę zapytać moje pliki CSV?

Cheers

Odpowiedz

3

Jeśli SQL jest wstępnie zdefiniowane i nie mogą być zmieniane najlepszym rozwiązaniem jest, aby załadować plik CSV do bazy danych i uruchamiania kwerend przeciwko niemu.

Apache Derby to realna opcja, a więc MySQL, która ma nawet CSV storage engine lub PostgreSQL.

Czy Twój SQL używa jakichkolwiek zastrzeżonych funkcji/rozszerzeń? Jeśli tak, może to ograniczyć Twoje wybory.

+0

Tak, używa podciągów i konkatenacji. –

3

Powiedziałbym, że wbudowany db. Proponuję Javadb (Derby wbudowany w API Javy) lub H2, jeśli nie dbasz o ciągnięcie dodatkowej zależności.

9

Załadowałbym dane do HSQL (HypersonicSQL). Czysta Java, poprawny SQL, sprawdzony. Niemal wszystko inne ma większy ślad.

+1

W rzeczywistości HSQLDB jest jedynym sugerowanym rozwiązaniem, które może otworzyć istniejący plik CSV jako tabelę SQL. Umożliwia zarówno wykonywanie zapytań SQL bezpośrednio w pliku CSV, jak i aktualizowanie rekordów. – fredt

+1

http://hsqldb.org/doc/guide/ch06.html zawiera dalsze szczegóły –

+0

Witam @ Vladimir, co jeśli plik csv, który chcę przetworzyć, jest bardzo duży pod względem 5 do 10 GB? – u449355

0

Istnieje skrypt Groovy, gcsvsql, który pozwala traktować pliki CSV jako tabele bazy danych, w tym łączenia. Z gcsvsql można robić takie rzeczy jak:

gcsvsql "select * from people.csv gdzie wiek> 40"

gcsvsql „wybierz people.name, dzieci.dziecko od people.csv, children.csv gdzie people.name = children.name”

gcsvsql "wybierz AVG (wynik) z people.csv gdzie wiek < 40"

można znaleźć ten skrypt, który oparty jest na silniku bazy h2, w kodzie Google tutaj:

http://code.google.com/p/gcsvsql/

1

Jeśli chcą leczyć pliki CSV baz danych z poziomu programu Java, należy spójrz na h2 database engine. Ma naprawdę dobrą obsługę odczytu/zapisu plików CSV i pracy z bazami danych w pamięci. Jest następcą hsql, szybszym i z dodatkowymi funkcjami. Możesz przeczytać o obsłudze CSV w samouczku h2.

+0

Możesz przeczytać, jak łatwo to zrobić za pomocą h2 w skrypcie Groovy w tym poście na blogu: http://bayesianconspiracy.blogspot.com/2010 /02/executing-arbitrary-sql-on-csv-files.html – Kolmogorov

1

Może trochę za późno, przepraszam za to.

Pracuję nad wersją csvjdbc od ponad roku i od kilku tygodni mam prawa administratora do tego projektu, więc mogłem opublikować najnowszą wersję, którą wyprodukowałem. to wszystko, czego "potrzebujemy" (my: ja i moi obecni moi koledzy) potrzebujemy, i dodajemy rzeczy, gdy są zgłaszane błędy.

spojrzeć na to teraz i podjąć decyzję ponownie. (Dokumentacja internetowa wciąż wymaga przeglądu, aby uzyskać lepszy wgląd, sprawdź przypadki testowe, które są bardzo obszerne).

+0

osadzone wybiera? aliasy tabel? nie, jeszcze nie dostępne. ale z drugiej strony, prosimy o przesłanie raportu o błędzie z niedziałającą kwerendą i kto wie ... – mariotomo

0

wiem, że jest to bardzo stara sprawa, ale ...

CsvJdbc jest cool biblioteka, ale są pewne problemy z wykorzystaniem DbUtils while ResultsSets mapowania do POJOs. Drugą wadą jest to, że nie ma dobrego wsparcia dla różnych typów danych.

Po zabawie z CSVJdbc użyję głupiego CsvParser do odczytania plików i wpompowania ich w HsqlDB lub coś w tym stylu.

+0

Czy zgłosiłeś problemy z csvjdbc? obecny opiekun (nie ja już) jest bardzo szybki w podejmowaniu poważnych problemów. – mariotomo

+0

Nie, nie mam. Nie jestem w stanie stworzyć tam biletu. – Mirko

+0

powinieneś być w stanie utworzyć bilet tam po zalogowaniu/rejestracji. anonimowi użytkownicy nie mogą tworzyć ani aktualizować biletów. Sądzę, że w celu uniknięcia spamu ... ale dokładniej, jakie "pewne problemy" napotkaliście i jakiego "dobrego wsparcia" oczekują? – mariotomo

Powiązane problemy