2011-01-03 2 views
2

Если я попытаюсь прочитать файл CSV с именем csv_file.csv. Проблема в том, что когда я читаю строки с BufferedReader.readLine(), он пропускает первую строку с месяцами. Но когда я переименую файл в csv_file.txt, он читает его в полном порядке и не пропускает первую строку.поведение Java BufferedReader в файле CSV vs 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*/ 
} 
+1

Показать Ваш код. BufferedReader не осведомлен о файле или имени файла, просто о содержимом, которое он читает у другого Reader. –

+0

i обновил описание моего вопроса ... и я знаю, что java не заботится о имени файла, но я получаю различное поведение для разных имен файлов. – Gabriel

+2

Кажется, надуманным, что изменение в поведении вызвано расширение. Как вы переименовываете файл (через переименование ОС или путем перепродажи через одно приложение или с помощью другого редактора)? Возможно, потребуется дополнительная отладка. Что произойдет, если вы измените расширение на «.csv»? Что делать, если вы сначала сохранили файл с расширением «.txt» (из Excel)? Каково содержимое для линии, которая выбрасывается? –

ответ

0

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

0

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

+0

Я использую eclipse на windows 7, и у меня есть стандартная строка, заканчивающая CR LF. и файл csv был создан путем сохранения файла excel в виде файла csv ... но я смотрю на него в блокноте ++ и нет ничего странного в файле – Gabriel

1

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

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

+0

, но все же ... хороший совет :) спасибо – Gabriel

1

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

  • 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(); 
    } 

} 
+0

я попробую это завтра ... – Gabriel