Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Miksi Java ei lue tiedostoa, jossa on skandeja?

LCHawk [19.08.2015 15:52:13]

#

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");
  }
 }

TapaniS [19.08.2015 18:06:37]

#

Testasin kotikoneella Win-ympäristössä ja kyllä ääkköset tulivat oikein.

LCHawk [19.08.2015 18:14:44]

#

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.

TuomasK [19.08.2015 20:15:18]

#

Veikkaisin että vika voisi olla luettavan tiedoston merkistökoodauksessa. En tosin tiedä mikä sen pitäisi olla että toimii, mutta se löytynee kokeilemalla.

Antti Laaksonen [19.08.2015 20:20:54]

#

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");

LCHawk [21.10.2015 11:57:59]

#

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?

_Pete_ [21.10.2015 13:55:25]

#

  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.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta