如何使用java从Csv打印多个列

时间:2015-06-24 07:37:16

标签: java csv

您好我正在尝试从.csv文件中获取特定数据,而我使用的代码是

import java.io.BufferedReader;
import java.io.FileReader;

public class InsertValuesIntoTestDb {


    public static void main(String[] args) throws Exception {


        String splitBy = ",";

        BufferedReader br = new BufferedReader(newFileReader("test.csv"));


        String line = br.readLine();

        while ((line = br.readLine()) !=null) {

             String[] b = line.split(splitBy);

             System.out.println(b[0]);
        }

        br.close();

  }

}

和.csv看起来像

a,f,w,b,numinst,af,ub

1RW,800,64,22,1,48:2,true

1RW,800,16,39,1,48:2,true

1RW,800,640,330,1,48:2,true

1RW,800,40,124,1,48:2,true

1RW,800,32,104,1,48:2,true

1RW,800,8,104,1,48:2,true

1R1W,800,65536,39,1,96:96,true

1R1W,800,2048,39,1,96:96,true

1R1W,800,8192,39,1,48:48,true

使用上面的代码我只能打印列' a'而我的o / p看起来像

a


1RW

1Rw

1Rw 

像这样,但我怎么能打印列f,w,b ??

我的输出应该是

f   w   b 

800 64 22

800 64 22

800 64 22

由于

3 个答案:

答案 0 :(得分:1)

只需将System.out.println(b[0]);更改为System.out.println(b[1]+" "+b[2]+" "+b[3]);

即可

答案 1 :(得分:0)

要在一行中显示所有值,您可以像这样更改while循环:

    while ((line = br.readLine()) !=null) {
         String[] b = line.split(splitBy);
         if (b.length > 3) {
           System.out.println(b[1] + ' ' + b[2] + ' ' + b[3] + ' ');
         } else {
           System.err.println("Not enough values in line " + line);
         }
    }

首先检查,如果至少有4列,然后打印第2,第3和第4个值。

希望这有帮助。

答案 2 :(得分:0)

使用String.split解析CSV不仅是不可靠的,而且速度也很慢。您在解析可能包含逗号字符,行分隔符等的值时遇到问题。此外,您需要处理具有不同列数的行以避免 ArrayIndexOutOfBoundsException

使用CSV解析器。 uniVocity-parsers可让您轻松获取CSV列:

CsvParserSettings parserSettings = new CsvParserSettings();
parserSettings.setHeaderExtractionEnabled(true);
parserSettings.selectFields("f", "w", "b");

CsvParser parser = new CsvParser(parserSettings);
List<String[]> parsedRows = parser.parseAll(newFileReader("test.csv"));

如果您要解析CSV并获取每列的值列表,可以使用RowProcessor并执行此操作:

CsvParserSettings parserSettings = new CsvParserSettings(); //many options here, check the documentation.
parserSettings.setHeaderExtractionEnabled(true); // gets the headers from the first row

// To get the values of all columns, use a column processor
ColumnProcessor rowProcessor = new ColumnProcessor();
parserSettings.setRowProcessor(rowProcessor);

CsvParser parser = new CsvParser(parserSettings);

//This will parse all rows and submit them to the column processor
parser.parse(newFileReader("test.csv"));

//Finally, we can get the column values:
Map<String, List<String>> columnValues = rowProcessor.getColumnValuesAsMapOfNames();

默认情况下会跳过空行(如果需要,则将解析器配置为不跳过空行)。 columnValues 地图中的列表将具有完全相同的大小,如果您的输入行的列数少于其他列,则相应的值将为 null

披露:我是这个图书馆的作者。它是开源和免费的(Apache V2.0许可证)。