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

谢谢!

4

2 回答 2

3

懒惰的方式是这样的:

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

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

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

于 2013-04-18T09:49:54.783 回答
2

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

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

此外 - 如果原始文件缺少尾随制表符,您可以在该行中添加额外的制表符以阻止这破坏您的代码。

于 2013-04-18T09:52:56.347 回答