我正在尝试读取包含6列的.csv文件,但最后一列中的某些行是空单元格。
item1 2 4 125 200
item2 5 8 250 375
item3 2 3 125 200
item4 2 4 200 325 10
item5 1 2 325 400 10
item6 1 2 250 350 10
结果
row 0: item1
row 1: 2.0
row 2: 4.0
row 3: 125.0
row 4: 200.0
new --------: 0
row 0: item2
row 1: 5.0
row 2: 8.0
row 3: 250.0
row 4: 375.0
new --------: 0
row 0: item3
row 1: 2.0
row 2: 3.0
row 3: 125.0
row 4: 200.0
- Java代码应该获取所有行,将每个值解析为double。
- 最后一列如果为空,则打印0值,否则解析最后一列值
问题:如何获取行的空单元格值并设置int lastColEmpytyValue = 0;?
while(inputStream.hasNext()) {
String data = inputStream.nextLine(); // gets a while line .next gets next word i.e. ice. .nextLine get word with spaces i.e. ice cream
String[] row = data.split(",", -1); // regex - split line
System.out.println("row 0: " + row[0] );
System.out.println("row 1: " + Double.parseDouble(row[1] ));
System.out.println("row 2: " + Double.parseDouble(row[2]) );
System.out.println("row 3: " + Double.parseDouble(row[3]) );
System.out.println("row 4: " + Double.parseDouble(row[4]) );
if (row[5] == null || row[5].isEmpty() || row[5] == "") {
int row5;
row[5] = "0";
row5 = Integer.parseInt(row[5]);
System.out.println("new --------: " +row5);
} else {
System.out.println("row 5.....: " + row[5]);
}
}
答案 0 :(得分:1)
你必须改变这条线,因为我不会看到','在您的示例数据中。
String[] row = data.split(",", -1);
,如果您的数据有标签或空格作为分隔符。
//if you have "tabbed" separated data
String[] row = data.split("\t", -1);
// if you have "space" separated data
//String[] row = data.split(" ", -1);
答案 1 :(得分:0)
问题是你无法获得空单元格值"什么时候没有价值。 split
函数将仅返回字符串中存在的元素数量。因此,在只有5个值的情况下,它将返回一个长度为5的数组(下标0到4)。然而,您无条件地尝试访问数组中的位置5(在if
语句中)。
相反,您应首先检查数组的length
,如果它小于5,则使用0作为值。
答案 2 :(得分:0)
您可以使用外部库来可靠地处理此问题吗? 如果您可以轻松快捷地尝试univocity-parsers:
CsvParserSettings settings = new CsvParserSettings();
settings.detectFormatAutomatically();
settings.setNullValue("0"); //if a value is null, convert it to 0
//always reads the first 6 columns
//you won't need this if the shorter rows with no data end with a tab
parserSettings.selectIndexes(0,1,2,3,4,5);
CsvParser parser = new CsvParser(settings);
//parse into Records as you can get primitive types from them.
List<Record> record = parser.parseAllRecords(file);
希望这会有所帮助。 免责声明:我是这个图书馆的作者。它是开源的,免费的。