Czy ktoś może polecić proste API, które pozwoli mi na odczytanie pliku wejściowego CSV, wykonanie kilku prostych przekształceń, a następnie zapisanie go.
Korzystam z piaskownicy Commons CSV od dłuższego czasu i nigdy nie napotkałem problemu. Naprawdę mam nadzieję, że wypromują go w pełni i wyciągną z piaskownicy.
Alex Marshall
3
@ bmatthews68 link do piaskownicy jest nieistniejący - wygląda na to, że został przeniesiony do właściwego apache commons (również zredagowałem link w odpowiedzi)
// jeśli pierwsza linia to nagłówek
String [] nagłówek = reader.readNext ();
// iteruj po reader.readNext, dopóki nie zwróci null
String [] line = reader.readNext ();
W odpowiedziach na inne pytanie było kilka innych możliwości .
Niestety, najnowszy plik do pobrania OpenCSV (wersja 2.2 w momencie komentowania) nie kompiluje się i nie zapewnia gotowego pliku binarnego.
opyate
9
Pakiet, który pobrałem z SourceForge, miał plik binarny w folderze wdrażania.
Mike Sickler
8
Jeśli używasz mavena, pamiętaj, że kod zależności na oficjalnej stronie zawiera deklarację wersji "2.0", która zawiera kilka błędów, ale w repozytoriach jest zaktualizowana wersja 2.3.
broundee,
ta biblioteka nie zapisuje pliku w osobnym wątku, prawda?
Aktualizacja: kod w tej odpowiedzi dotyczy formatu Super CSV 1.52. Zaktualizowane przykłady kodu dla Super CSV 2.4.0 można znaleźć na stronie projektu:
http://super-csv.github.io/super-csv/index.html
Twój kod się nie skompilował, więc przesłałem kilka poprawek. Ponadto ParseDate () nie działa poprawnie, więc zastąpiłem go, aby odczytać String. Można go przeanalizować później.
1
Duże ograniczenie: SuperCSV nie jest bezpieczny dla wątków, zamierzam spojrzeć na Jacksona, chociaż może być bardziej ograniczony
ZiglioUK
SuperCsv nie pozwala również na używanie multimap. Byłoby miło zobaczyć, jak działa z MultiMaps.
Sid
19
Po przeczytaniu opisu formatu CSV czuję, że korzystanie z biblioteki innej firmy byłoby mniejszym bólem głowy niż samodzielne pisanie:
Porównałem biblioteki wymienione za pomocą jakiejś listy kontrolnej. OpenCSV okazał się dla mnie zwycięzcą (YMMV) z następującymi wynikami:
+ maven
+ maven - release version // had some cryptic issues at _Hudson_ with snapshot references => prefer to be on a safe side+ code examples
+ open source // as in "can hack myself if needed"+ understandable javadoc // as opposed to eg javadocs of _genjava gj-csv_+ compact API // YAGNI (note *flatpack* seems to have much richer API than OpenCSV)- reference to specification used // I really like it when people can explain what they're doing- reference to _RFC 4180_ support // would qualify as simplest form of specification to me- releases changelog // absence is quite a pity, given how simple it'd be to get with maven-changes-plugin // _flatpack_, for comparison, has quite helpful changelog+ bug tracking
+ active // as in "can submit a bug and expect a fixed release soon"+ positive feedback // Recommended By 51 users at sourceforge (as of now)
Jedynym problemem związanym z tą biblioteką jest to, że nie pozwala ona na wyprowadzanie plików CSV z terminatorami linii Windows ( \r\n), gdy nie jest uruchomiona w systemie Windows. Autor nie udzielał wsparcia od lat. Musiałem go rozwidlić, aby umożliwić tę brakującą funkcję: JavaCSV 2.2
Mosty Mostacho
6
W przypadku ostatniej aplikacji korporacyjnej, nad którą pracowałem, która wymagała obsługi znacznej ilości plików CSV - kilka miesięcy temu - użyłem SuperCSV w sourceforge i stwierdziłem, że jest prosta, solidna i bezproblemowa.
+1 dla SuperCSV, ale ma kilka nieprzyjemnych błędów, które nie zostały jeszcze naprawione, nowe błędy nie są obecnie obsługiwane, a ostatnie wydanie ma prawie dwa lata. Ale używamy poprawionej / zmodyfikowanej wersji w produkcji bez żadnych problemów.
MRalwasser,
2
@MRalwasser Super CSV 2.0.0-beta-1 został niedawno wydany. Zawiera wiele poprawek błędów i nowych funkcji (w tym obsługę Maven i nowe rozszerzenie Dozer do mapowania zagnieżdżonych właściwości i tablic / kolekcji)
James Bassett
1
@ Hound-Dog Dziękuję za aktualizację, już zauważyłem nową betę i cieszę się, że projekt żyje - chociaż częstotliwość zatwierdzeń wciąż mnie trochę obawia (prawie wszystkie zatwierdzenia tylko przez kilka dni). Ale spojrzę. Czy jest szacowana data premiery ostatecznej wersji 2.0?
MRalwasser
2
@MRalwasser Jestem w tej chwili jedynym deweloperem i mam pracę na pełny etat, więc pracuję nad tym, gdy tylko dostanę darmowy weekend - stąd sporadyczne zatwierdzenia :) Prawie 1000 SF pobrań wersji beta teraz i żadnych błędów, więc szukam ostatecznego wydania na początku przyszłego miesiąca. Jeśli masz jakieś pomysły na przyszłe funkcje, daj nam znać.
James Bassett
1
SuperCSV nie jest bezpieczny dla wątków na tym etapie, co czyni go niezbyt solidnym
imho
5
Możesz użyć csvreader api & download z następującej lokalizacji:
/************* For Writing ***************************/import java.io.File;import java.io.FileWriter;import java.io.IOException;import com.csvreader.CsvWriter;publicclassCsvWriterAppendExample{publicstaticvoid main(String[] args){String outputFile ="users.csv";// before we open the file check to see if it already existsboolean alreadyExists =newFile(outputFile).exists();try{// use FileWriter constructor that specifies open for appendingCsvWriter csvOutput =newCsvWriter(newFileWriter(outputFile,true),',');// if the file didn't already exist then we need to write out the header lineif(!alreadyExists){
csvOutput.write("id");
csvOutput.write("name");
csvOutput.endRecord();}// else assume that the file already has the correct header line// write out a few records
csvOutput.write("1");
csvOutput.write("Bruce");
csvOutput.endRecord();
csvOutput.write("2");
csvOutput.write("John");
csvOutput.endRecord();
csvOutput.close();}catch(IOException e){
e.printStackTrace();}}}
Format CSV brzmi dość łatwo dla StringTokenizera, ale może stać się bardziej skomplikowany. Tutaj, w Niemczech, jako separator używany jest średnik, a komórki zawierające ograniczniki muszą zostać zmienione. Nie poradzisz sobie tak łatwo z StringTokenizer.
Jeśli zamierzasz czytać csv z programu Excel, jest kilka interesujących przypadków narożnych. Nie pamiętam ich wszystkich, ale apache commons csv nie był w stanie obsłużyć tego poprawnie (np. Z adresami URL).
Pamiętaj, aby przetestować dane wyjściowe programu Excel za pomocą cudzysłowów, przecinków i ukośników w każdym miejscu.
Odpowiedzi:
Apache Commons CSV
Sprawdź Apache Common CSV .
Ta biblioteka odczytuje i zapisuje kilka odmian CSV , w tym standardowy RFC 4180 . Również czyta / zapisuje pliki rozdzielane tabulatorami .
źródło
W przeszłości korzystałem z OpenCSV .
W odpowiedziach na inne pytanie było kilka innych możliwości .
źródło
Aktualizacja: kod w tej odpowiedzi dotyczy formatu Super CSV 1.52. Zaktualizowane przykłady kodu dla Super CSV 2.4.0 można znaleźć na stronie projektu: http://super-csv.github.io/super-csv/index.html
Projekt SuperCSV bezpośrednio wspiera analizę i strukturalną manipulację komórkami CSV. Na http://super-csv.github.io/super-csv/examples_reading.html znajdziesz np.
danej klasy
i że masz plik CSV z nagłówkiem. Załóżmy następującą treść
Następnie możesz utworzyć wystąpienie elementu UserBean i wypełnić go wartościami z drugiego wiersza pliku następującym kodem
używając następującej „specyfikacji manipulacji”
źródło
Po przeczytaniu opisu formatu CSV czuję, że korzystanie z biblioteki innej firmy byłoby mniejszym bólem głowy niż samodzielne pisanie:
Wikipedia wymienia 10 lub inne znane biblioteki:
Porównałem biblioteki wymienione za pomocą jakiejś listy kontrolnej. OpenCSV okazał się dla mnie zwycięzcą (YMMV) z następującymi wynikami:
źródło
Używamy JavaCSV , działa całkiem nieźle
źródło
\r\n
), gdy nie jest uruchomiona w systemie Windows. Autor nie udzielał wsparcia od lat. Musiałem go rozwidlić, aby umożliwić tę brakującą funkcję: JavaCSV 2.2W przypadku ostatniej aplikacji korporacyjnej, nad którą pracowałem, która wymagała obsługi znacznej ilości plików CSV - kilka miesięcy temu - użyłem SuperCSV w sourceforge i stwierdziłem, że jest prosta, solidna i bezproblemowa.
źródło
Możesz użyć csvreader api & download z następującej lokalizacji:
http://sourceforge.net/projects/javacsv/files/JavaCsv/JavaCsv%202.1/javacsv2.1.zip/download
lub
http://sourceforge.net/projects/javacsv/
Użyj poniższego kodu:
Zapisz / dołącz do pliku CSV
Kod:
źródło
Istnieje również narzędzie CSV / Excel . Zakłada, że wszystkie te dane są podobne do tabeli i dostarcza dane z Iteratorów.
źródło
Format CSV brzmi dość łatwo dla StringTokenizera, ale może stać się bardziej skomplikowany. Tutaj, w Niemczech, jako separator używany jest średnik, a komórki zawierające ograniczniki muszą zostać zmienione. Nie poradzisz sobie tak łatwo z StringTokenizer.
Poszedłbym na http://sourceforge.net/projects/javacsv
źródło
Jeśli zamierzasz czytać csv z programu Excel, jest kilka interesujących przypadków narożnych. Nie pamiętam ich wszystkich, ale apache commons csv nie był w stanie obsłużyć tego poprawnie (np. Z adresami URL).
Pamiętaj, aby przetestować dane wyjściowe programu Excel za pomocą cudzysłowów, przecinków i ukośników w każdym miejscu.
źródło