我有一个制表符分隔文件,我必须从文件中读取数据。
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];
}
谢谢!
答案 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);
另外 - 如果原始文件缺少尾随标签,您可以在该行中添加额外的标签,以阻止此代码损坏。