Ékezetes karakterek csv beolvasás
2014-09-08T11:38:28+02:00
2014-09-08T20:07:26+02:00
2022-08-09T02:00:32+02:00
anclung
Van egy csv táblázatom, melynek egy sorában egy név és egy érték van pontosvesszővel elválasztva.
A probléma, hogy amikor a név stringet beolvasom a memóriába, az ékezetes karaktereket nem tudja kezelni, vagyis ezek
helyett ? (kérdőjel) jelenik meg az outputon. Tudna valaki segíteni, hogy mi a megoldás?
Itt a leegyszerűsített kód:

BufferedReader br = null; String line = ""; String cvsSplitBy = ";"; br = new BufferedReader(new FileReader(path)); while ((line = br.readLine()) != null) { // a hatarolo karakter menten feldarabolja a sort String[] sor = line.split(cvsSplitBy); System.out.println(sor[0]+" "+sor[1]); }
Mutasd a teljes hozzászólást!
Itt két dolog is bekavarhat:
Egyrészt a CSV fájlod kódolása lehet nem egyezik azzal, amilyen kódolással a FileReader osztály próbálja beolvasni. A FileReader által használt kódolás az úgynevezett default kódolás, aminek a mindenkori értéke függ a környezettől (az oprendszertől és akár az oprendszer aktuális nyelvi beállításától is), ezért érdemes inkább elkerülni. Kézzel meg tudsz adni kódolást, ha FileReader helyett FileInputStream+InputStreamReader kombót használsz, így:

br = new BufferedReader(new InputStreamReader(new FileReader(path), "UTF-8"));
(ez konkrétan UTF-8 kódolást kér)
Másrészt ha az oprendszer konzoljára írsz ki, akkor lehet, hogy a konzol nem azzal a kódolással értelmezi a kimenetet, mint ahogy a Java küldi, ezért a konzol maga cseréli le kérdőjelekre a karaktereket. Ezzel sajnos sok mindent nem tudsz kezdeni, a konzolra való kiíráshoz megint csak a default kódolást használja a Java, és nem nagyon tudod ezt befolyásolni. Meg lehet próbálni fájlba átirányítani a kimenetet, és nézőkével megnézni, lehetőleg olyannal, ami több kódolást is ismer (pl. a Total Commander nézőkéje ilyen).
Mutasd a teljes hozzászólást!

  • Köszi a segítséget, de egyelőre sajnos nem oldódott meg a probléma. Valószínűleg nem a konzollal van a gond, mert - ezt ugyan nem írtam, de - az adatokat adatbázisba tettem, és ott is a kérdőjelek jelennek meg. A másik, hogy kicseréltem a megfelelő sort arra, amit írtál, de a következő üzenetet kapom: "no suitable constructor found for InputStreamReader Filereader,String) constructor InputStreamReader.InputStreamReader (InputStream, String) is not applicable (argument mismatch; FileReader cannot be converted to InputStream)..." stb.
    Mutasd a teljes hozzászólást!
  • Közben addig próbálkoztam, hogy megoldódott a dolog, a következő utasítással:

    br = new BufferedReader(new InputStreamReader(new FileInputStream(path), "Windows-1252"));

    Mindenesetre köszönöm amit írtál, mert azon az úton indultam el.
    Mutasd a teljes hozzászólást!
  • A másik, hogy kicseréltem a megfelelő sort arra, amit írtál, de a következő üzenetet kapom:
    "no suitable constructor found for InputStreamReader Filereader,String)
    constructor InputStreamReader.InputStreamReader (InputStream, String) is not applicable (argument mismatch; FileReader cannot be converted to InputStream)..." stb

    A szövegbe még jól írtam, hogy FileInputStream kell, de a forrásba már FileReadert írtam. Mindegy, a lényeg, hogy ki tudtad találni, mi a helyes
    Mutasd a teljes hozzászólást!
  • Sajnos elhamarkodtam a dolgot, mégsem jó. Az első egyáltalán nem kezeli az ékezetes karaktereket a második igen, de a hosszú "ű"betűt sajnos nem.

    br = new BufferedReader(new FileInputStreamReader(new FileInputStream(path), "UTF-8"));
    br = new BufferedReader(new InputStreamReader(new FileInputStream(path), "Windows-1252"));

    Úgyhogy, ha van még ötleted, akkor azt szívesen fogadom, ha nem, megpróbálok tovább gúglizni.
    Mutasd a teljes hozzászólást!
  • Na, most már tényleg jó lett. A második paraméternek a "Cp1250" kellett. Köszi az eddigieket. :)
    Mutasd a teljes hozzászólást!
  • avagy windows-1250; a lényeg, hogy a végén ne 1252 legyen, mert az a nyugat-európai (latin1)
    Mutasd a teljes hozzászólást!
abcd