尝试解析某些COLUMN单元格为空的csv文件

时间:2018-05-04 02:31:57

标签: java string csv parsing java.util.scanner

我正在尝试读取包含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]);

    }
}

3 个答案:

答案 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);

希望这会有所帮助。 免责声明:我是这个图书馆的作者。它是开源的,免费的。