2009-11-08 15 views
13

Próbuję przetworzyć plik .csv z OpenCSV w NetBeans 6.0.1. Mój plik zawiera trochę znaków Unicode. Kiedy piszę to na wyjściu, postać pojawia się w innej formie, np. (HJ1'-E /;). Kiedy po otwarciu tego pliku w Notatniku, wygląda dobrze.Parsować plik CSV zawierający znak Unicode, korzystając z OpenCSV

Kod, który kiedyś:

CSVReader reader=new CSVReader(new FileReader("d:\\a.csv"),',','\'',1); 
    String[] line; 
    while((line=reader.readNext())!=null){ 
     StringBuilder stb=new StringBuilder(400); 
     for(int i=0;i<line.length;i++){ 
      stb.append(line[i]); 
      stb.append(";"); 
     } 
     System.out.println(stb); 
    } 

Odpowiedz

31

Najpierw musisz wiedzieć, jakiego kodowania pliku jest taki jak UTF-8 lub UTF-16. Na czym polega generowanie tego pliku?

Po tym, jest stosunkowo prosta - musisz utworzyć FileInputStream zapakowany w InputStreamReader zamiast tylko FileReader. (FileReader zawsze używa domyślnego kodowania dla systemu.) Określ kodowanie, które będzie używane podczas tworzenia InputStreamReader, a jeśli wybierzesz odpowiednie, wszystko powinno zacząć działać.

Pamiętaj, że nie musisz używać OpenCSV, aby to sprawdzić - możesz po prostu odczytać tekst pliku i wydrukować go. Nie jestem pewien, czy mógłbym zaufać System.out, aby móc posługiwać się znakami spoza ASCII - możesz chcieć znaleźć inny sposób sprawdzania ciągów znaków, np. Drukować poszczególne wartości znaków jako liczby całkowite (najlepiej w hex) i następnie porównując je z charts at unicode.org. Z drugiej strony, można spróbować odpowiedniego kodowania i zobaczyć, co się dzieje na początek ...

EDIT: Ok, więc jeśli używasz UTF-8

CSVReader reader=new CSVReader(
    new InputStreamReader(new FileInputStream("d:\\a.csv"), "UTF-8"), 
    ',', '\'', 1); 
String[] line; 
while ((line = reader.readNext()) != null) { 
    StringBuilder stb = new StringBuilder(400); 
    for (int i = 0; i < line.length; i++) { 
     stb.append(line[i]); 
     stb.append(";"); 
    } 
    System.out.println(stb); 
} 

(mam nadzieję, że spróbuj/ostatecznie zablokuj, aby zamknąć plik w swoim prawdziwym kodzie.)