Java csv动态迭代迭代

时间:2015-10-16 16:33:19

标签: java csv header bufferedreader

我有一个要求:

  1. 我的输入将是一个csv文件,我将获得如下值:

    f:
    .LFB0:
    .cfi_startproc
    pushq   %rbp              ; save the pointer to the caller's frame
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp        ; new frame starts from %rsp (current stack ptr)
                              ; starting from this place look how %rbp is used
                              ; the maximum offset is what you're looking for
    .cfi_def_cfa_register 6
    movl    %edi, -20(%rbp) 
    movl    %esi, -24(%rbp)
    movl    -20(%rbp), %edx
    movl    -24(%rbp), %eax
    addl    %edx, %eax
    movl    %eax, -8(%rbp)
    movl    -8(%rbp), %eax
    subl    $2, %eax
    movl    %eax, -4(%rbp)
    movl    -4(%rbp), %eax
    popq    %rbp
    .cfi_def_cfa 7, 8
    ret
    
  2. 我必须根据标题阅读此csv文件。比如说:如果action = 1且email是null,那么我必须从action更改为2或者将email更改为null或类似的东西。

  3. 我不知道如何根据标题读取和解析值。这是我尝试的代码:

    action, userId, firstName, email, lastName
    1,2,sample,abc@gmail.com,test
    2,3,justtest,def@gmail.com,test
    
  4. 这只是打印新行中的所有值,如下所示:

    String csvFile = "C:\\Test.csv";
        // create BufferedReader to read csv file
        BufferedReader br;
        String line = "";
        br = new BufferedReader(new FileReader(csvFile));
        br.readLine();
        // Read the file line by line starting from the second line
        while ((line = br.readLine()) != null) {
            // Get all tokens available in line
            String[] tokens = line.split(",");
            if (tokens.length > 0) {
                for (int i = 0; i < tokens.length; i++) {
                    System.out.println("All Rows ------->" + tokens[i]);
                }
            }
        }
    

    请帮我填写此代码。提前谢谢。

2 个答案:

答案 0 :(得分:2)

为了将CSV文件解析为可后处理的格式,我首先创建一个枚举,按正确的顺序对文件的列进行建模:

enum Column {
    ACTION, USERID, FIRSTNAME, EMAIL, LASTNAME;
    public static final Column[] VALUES = values();
}

然后,我会将文件读入列到列值列表的映射中(此数据结构也称为&#34; multimap&#34;):

Map<Column, List<String>> columns = 
    new LinkedHashMap<>();
// initialize the map
for (Column c : Column.VALUES) {
    columns.put(c, new ArrayList<>());
}

String csvFile = "C:\\Test.csv";        
String line = "";
// create BufferedReader to read csv file
BufferedReader br = new BufferedReader(new FileReader(csvFile));
br.readLine();

// Read the file line by line starting from the second line
while ((line = br.readLine()) != null) {
    // Get all tokens available in line
    String[] tokens = line.split(",");
    if (tokens.length > 0) {
        for (int i = 0; i < tokens.length; i++) {
            columns.get(Column.VALUES[i]).add(tokens[i].trim());
        }
    }
}

现在您已订购数据,您可以根据业务规则开始对值进行后处理。当然,您也可以在读取文件时应用规则,但这可能会损害代码的可读性。访问文件中的单个单元格很容易;例如可以使用columns.get(Column.EMAIL).get(1)检索第二行的电子邮件地址。

正在运行

System.out.println(columns);

使用您的示例文件输出:

{ACTION=[1, 2], USERID=[2, 3], FIRSTNAME=[sample, justtest], 
 EMAIL=[abc@gmail.com, def@gmail.com], LASTNAME=[test, test]}

答案 1 :(得分:2)

使用Apache Common CSV库(或任何其他合适的库)读取CSV文件,然后在程序中应用业务逻辑。

https://commons.apache.org/proper/commons-csv/

它将以CSVRecord的形式为您提供行列表,然后您只需要通过迭代列表来应用基于值的业务逻辑。列表中的第一个元素将是您的标题。

        Reader in = new FileReader("File Name");
        CSVParser parser = new CSVParser(in, CSVFormat.EXCEL);
        List<CSVRecord> csvRecords = parser.getRecords();