Alla on ohjelma, jota käytetään tekstin muokkaamisessa R-ohjelmaa varten sopivaan "formaattiin". Ohjelma toimii hyvin niin kauan, kun tekstissä ei tule vastaan skandinavavisia merkkejä. Kun näin käy, ohjelma ei kirjoita tiedostoon mitään. Osaisiko joku sanoa, missä on vika?
import java.io.*; import java.util.Scanner; import java.util.ArrayList; import java.util.StringTokenizer; /** * Luokan avulla luetaan tekstiedosto ja lisätään jokaisen sanan ympärille lainausmerkit (") ja sanan * jälkeen pilkku (,) * */ public class Tekstinkasittelija { private static Scanner lukija = new Scanner(System.in); public static void main(String[] args) throws FileNotFoundException { ArrayList<String> rivilista=new ArrayList<>(); ArrayList<String> apulista=new ArrayList<>(); ArrayList<String> pilkottu=new ArrayList<>(); String s; int i=0; System.out.println("Minkä tiedoston haluat käsitellä?"); String tiedostonNimi=lukija.nextLine(); File tiedosto_olio = new File(tiedostonNimi); if (!tiedosto_olio.exists()) { System.out.println("Tiedostoa "+ tiedostonNimi +" ei löydy!"); return; // keskeytetään kaikki! } Scanner syöttötiedosto = new Scanner(tiedosto_olio); while (syöttötiedosto.hasNextLine()) { String rivi = syöttötiedosto.nextLine(); //Laitetaan rivi listaan rivilista.add(rivi); //System.out.println(rivi); } syöttötiedosto.close(); // Huom.!! //Pilkotaan StringTokenizer pilkkoja; while(i<rivilista.size()){ pilkkoja=new StringTokenizer(rivilista.get(i)); while(pilkkoja.hasMoreTokens()){ pilkottu.add(pilkkoja.nextToken()); } i++; } //Käydään kaikki läpi ja lisätään lainausmerkki sekä pilkku. i=0; String aChar = new Character((char) 34).toString(); while(i<pilkottu.size()){ if(i==pilkottu.size()-1){ apulista.add(aChar+pilkottu.get(i)+aChar); }else{ apulista.add(aChar+pilkottu.get(i)+aChar+","); } i++; } //Tehdään kunnes ei olla tyhjä i=0; rivilista=apulista; //Kirjoitetaan tekstitiedostoon PrintWriter kirjoittaja = new PrintWriter("testi.txt"); while(i<rivilista.size()){ kirjoittaja.println(rivilista.get(i)); i++; } kirjoittaja.close(); System.out.println("Kirjoitettu"); } }
Testasin kotikoneella Win-ympäristössä ja kyllä ääkköset tulivat oikein.
Outoa. Minulla ei Windowsilla toimi. Alkuperäinen data on Excelistä, josta siirrän sen kopioimalla Muistioon ja sitten tallensin muistion tiedostoihin. Ei toiminut sieltä käsin. Ympäristönä on BlueJ.
Veikkaisin että vika voisi olla luettavan tiedoston merkistökoodauksessa. En tosin tiedä mikä sen pitäisi olla että toimii, mutta se löytynee kokeilemalla.
Luulen myös, että vika on merkistökoodauksessa. Joskus Java ei lue tiedostosta mitään, jos tiedoston merkistö eroaa Javan olettamasta.
Jos merkistökoodaus on UTF-8, seuraava saattaa toimia:
Scanner syöttötiedosto = new Scanner(tiedosto_olio, "UTF-8");
Laitaan tätä vanhaa ketjua ja kysäisen tässä taas skandiongelmistani: Eli Javalla käsittelen CSV-tiedostoja. Käytän openCSV-kirjastoa ja luen seuraavallal tavalla:
CSVReader reader = new CSVReader(new FileReader("data.csv"));
Kaikki skandit tulostuvat neliöinä. Millä tavalla merkistökoodauksen saisi kuntoon, jotta skandien lukeminen toimisi oikein?
public static void test_win() throws Exception { File f = new File("test_win.csv"); FileInputStream fis = new FileInputStream(f); InputStreamReader isr = new InputStreamReader(fis, "windows-1252"); CSVReader reader = new CSVReader(isr); List myEntries = reader.readAll(); }
Saa toimimaan tuohon tyyliin, määrittelemällä saman ja oikean merkistökoodauksen InputStreamReader luokkaan kun on myös käytetty .csv tiedoston talletukseen.
Aihe on jo aika vanha, joten et voi enää vastata siihen.