Поведение Java BufferedReader в файле CSV и TXT - PullRequest
2 голосов
/ 03 января 2011

Если я пытаюсь прочитать CSV-файл с именем csv_file.csv.Проблема в том, что когда я читаю строки с BufferedReader.readLine(), пропускается первая строка с месяцами.Но когда я переименовываю файл в csv_file.txt, он читает его правильно и не пропускает первую строку.

Есть ли недокументированная «особенность» BufferedReader, которую я не знаю?

Пример файла:

Months, SEP2010, OCT2010, NOV2010
col1, col2, col3, col4, col5
aaa,,sdf,"12,456",bla bla bla, xsaffadfafda
and so on, and so on, "10,00", xxx, xxx

Код:

FileInputStream stream = new FileInputStream(UploadSupport.TEMPORARY_FILES_PATH+fileName);
BufferedReader br = new BufferedReader(new InputStreamReader(stream, "UTF-8"));
String line = br.readLine();
String months[] = line.split(",");
while ((line=br.readLine())!=null) {
    /*parse other lines*/
}

Ответы [ 4 ]

1 голос
/ 03 января 2011

Нет разницы в моей системе:

  • Windows Vista SP2 (32-разрядная версия)
  • NTFS
  • JDK 1.6.0_17

Выход:

Creating C:\workspace\Sandbox\src\data.txt

Reading C:\workspace\Sandbox\src\data.txt
Skipped: 'Months, SEP2010, OCT2010, NOV2010'
First read: 'col1, col2, col3, col4, col5'

Reading C:\workspace\Sandbox\src\data.csv
Skipped: 'Months, SEP2010, OCT2010, NOV2010'
First read: 'col1, col2, col3, col4, col5'

Reading C:\workspace\Sandbox\src\data.txt
Skipped: 'Months, SEP2010, OCT2010, NOV2010'
First read: 'col1, col2, col3, col4, col5'

Код:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;


public class BuffReadTest {

    public static void main(final String[] args) {
        final String baseFilename = args[0] + "/data";
        try {
            final File txtFile = new File(baseFilename+".txt");
            final File csvFile = new File(baseFilename+".csv");

            if (txtFile.exists())   txtFile.delete();
            if (csvFile.exists())   csvFile.delete();
            createFile(txtFile.getAbsolutePath());

            readFile(txtFile.getAbsolutePath());

            txtFile.renameTo(csvFile);
            readFile(csvFile.getAbsolutePath());

            csvFile.renameTo(txtFile);
            readFile(txtFile.getAbsolutePath());

        } catch (final IOException ex) {
            System.out.println("Exception: "+ex);
            ex.printStackTrace();
        }
    }

    private static void createFile(final String filename)
            throws FileNotFoundException {
        System.out.println("\nCreating "+filename);
        final PrintWriter pw = new PrintWriter(filename);
        pw.println("Months, SEP2010, OCT2010, NOV2010");
        pw.println("col1, col2, col3, col4, col5");
        pw.println("aaa,,sdf,\"12,456\",bla bla bla, xsaffadfafda");
        pw.println("and so on, and so on, \"10,00\", xxx, xxx");
        pw.close();
    }

    private static void readFile(final String filename)
            throws FileNotFoundException, IOException {
        System.out.println("\nReading "+filename);
        final FileInputStream stream = new FileInputStream(filename);
        final BufferedReader br = new BufferedReader(new InputStreamReader(stream));
        final String skipped = br.readLine();
        final String first = br.readLine();

        System.out.println("Skipped: '"+skipped+"'");
        System.out.println("First read: '"+first+"'");
        br.close();
    }

}
1 голос
/ 03 января 2011

В общем случае, использование конструктора InputStreamReader(InputStream in), который использует "кодировку по умолчанию", является плохой практикой.Вы должны явно указать кодировку.

Это вряд ли может объяснить вашу проблему.

0 голосов
/ 03 января 2011

Ваш редактор делает что-то особенное при сохранении файла? Вы работаете над Windows? (между linux и windows есть некоторые различия в Newline, хотя я никогда не сталкивался с проблемами при использовании Java)

0 голосов
/ 03 января 2011

Что ж, расширение файла игнорируется Java (фактически единственное, что обычно заботится о расширениях файлов - это Windows).Я предполагаю, что у вас есть какая-то новая / очень тонкая проблема кодирования, вызывающая проблему, которую вы видите.

...