2013-04-18 50 views
3

我有一个制表符分隔文件,我必须从文件中读取数据。阅读制表符分隔的文本文件时出现问题?

Col1 Col2 Col3 
data1 data2 data3 
data1 data2 data3 

如果所有列均存在值,则不存在问题。问题是有时候少数列可能不包含如下所示的值。

Col1 Col2 Col3 
data1   data3 
data1 data2 

在上面的数据中,能够读取第一行的数据,因为col2的值将为空字符串。 但第二行的col3没有数据。这里我得到了数组索引超出范围的例外。 为什么我没有得到第二行col3的空字符串?

我使用如下代码:

String dataFileName = "C:\\Documents and Settings\\User1\\some.txt"; 

     /** 
      * Creating a buffered reader to read the file 
      */ 
     BufferedReader bReader = new BufferedReader(
       new FileReader(dataFileName)); 

     String line; 

     /** 
      * Looping the read block until all lines in the file are read. 
      */ 
     while ((line = bReader.readLine()) != null) { 

      /** 
       * Splitting the content of tabbed separated line 
       */ 
      String datavalue[] = line.split("\t"); 
      String value1 = datavalue[0]; 
      String value2 = datavalue[1]; 
      String value3 = datavalue[2]; 
} 

谢谢!

+5

不是你的问题的答案,但一些共同的指导。应该考虑使用一些库来读取客栈的CSV文件,而不是重新发明轮子。像CSVReader一样:http://javacsv.sourceforge.net/com/csvreader/CsvReader.html – philnate

+1

@philnate是正确的,我只是写了同样的评论。大多数CSV库支持任意分隔符(例如制表符)。我会建议您尽快切换!它可以帮助你解决这个问题和其他问题,比如引用文字等。 –

+0

为什么你不使用这个表格结构的数据库 –

回答

3

偷懒的方法是这样的:

... 
String datavalue[] = Arrays.copyOf(line.split("\t"),3); 
String value1 = datavalue[0]; 
String value2 = datavalue[1]; 
String value3 = datavalue[2]; 
... 

基本上你是分裂的内容并将其复制到一个新的数组中,作为记录的填充内容为空:

复制指定的数组,截断或用空值填充(如果需要 ),以便副本具有指定的长度。对于 在原始数组和复制中均有效的所有索引,这两个数组将包含相同的值。对于副本 中有效但不是原始副本的索引,副本将包含空值。当且仅当指定的长度大于原始数组的 时,这样的 索引才存在。生成的数组与原始数组的类型完全相同 类。

2

String.split默认情况下将重复分隔符合并为一个。你应该使用负的第二个参数:

String datavalue[] = (line+"\t\t\t").split("\t",-1); 

而且 - 以防原始文件丢失尾随标签,你可以额外的选项卡添加到行制止这种破坏你的代码。