读取制表符分隔的文本文件时出现问题?

时间:2013-04-18 09:46:07

标签: java

我有一个制表符分隔文件,我必须从文件中读取数据。

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];
}

谢谢!

2 个答案:

答案 0 :(得分:3)

懒惰的方式是:

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

基本上,您正在拆分内容并将其复制到一个新的数组,其中填充元素为空,如下所示:

  

使用空值复制指定的数组,截断或填充(如果   必要的)所以副本有指定的长度。对于所有指数   在原始数组和副本中都有效,两个数组都会有效   包含相同的值。对于副本中有效的任何索引   但不是原始版本,副本将包含null。这样   当且仅当指定的长度大于时,索引才会存在   原始数组的那个。结果数组完全相同   class作为原始数组。

答案 1 :(得分:2)

默认情况下,

String.split将重复的分隔符合并为一个。您应该使用负的第二个参数:

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

另外 - 如果原始文件缺少尾随标签,您可以在该行中添加额外的标签,以阻止此代码损坏。