【问题标题】:In a single csv file, compare two lines for equality在单个 csv 文件中,比较两行是否相等
【发布时间】:2016-09-17 17:11:09
【问题描述】:

我有一个包含多行的 CSV 文件。

1shelf CSV 文件示例内容:

#ManagementNode,SHELF-INFORMATION,NE_ID,RACK_ID,SHLEF_ID,STATUS,SHELF_TYPE,MAX_SLOT_NUMBER
ManagementNode,SHELF-INFORMATION,0005,0,0,,,13
#ManagementNode,BOARD-INFORMATION,NE_ID,RACK_ID,SHELF_ID,SLOT_ID,BOARD_NAME,ACTIVE_MODE,ADMIN_STATE,OPER_STATE,VERSION,SERIAL_NO,MANUFACTURER,MANUFACTURE_DATE
ManagementNode,BOARD-INFORMATION,0005,0,0,6,LEMA0,ACTIVE,UNLOCK,ENABLE,,S61F91571,XYZ,2014-09-03

2shelf CSV 文件示例内容:

#ManagementNode,SHELF-INFORMATION,NE_ID,RACK_ID,SHLEF_ID,STATUS,SHELF_TYPE,MAX_SLOT_NUMBER
ManagementNode,SHELF-INFORMATION,0001,0,0,,,13
#ManagementNode,SHELF-INFORMATION,NE_ID,RACK_ID,SHLEF_ID,STATUS,SHELF_TYPE,MAX_SLOT_NUMBER
ManagementNode,SHELF-INFORMATION,0001,0,1,,,13

请注意,2shelf 文件中第 1 行和第 3 行的标题值相同,第 2 行第 5 行值为 0,第 5 行第 5 行值为 1,这意味着它是一个 2shelf 文件。 1shelf 文件的情况并非如此。

我是 Java 新手,能够打印所需的行,但不知道如何实现比较逻辑以找出 1shelf 或 2shelf 文件。

BufferedReader in = new BufferedReader (new FileReader("C:\\Files\\1_2_Shelf\\Test.csv"));
        String info = "";
            int startLine = 4;
            int endLine = 7;
            for (int i = 0; i < startLine; i++) { 
                info = in.readLine();
                }
            for (int i = startLine; i < endLine + 1; i++) {
                info = in.readLine();
                System.out.println(info);
            }

            in.close();
        }

【问题讨论】:

    标签: java file csv


    【解决方案1】:

    将下面显示的import 添加到类文件的顶部。

    然后使用info.split(",") 将 CSV 字符串分解为数组中的字段。

    然后您将使用字段索引 = 4 获取数组的第 5 个字段(数组元素索引从零开始)。

    下面的示例代码,插入到您的原始代码中:

    import java.util.regex.Pattern;    // NEW import to add at top of your file
    ...
    
    // Some constants for identifying shelves
    final int FIELD_SHELF_ID = 4;
    final String SHELF1 = "0";
    final String SHELF2 = "1";
    
    BufferedReader in = 
        new BufferedReader (new FileReader("C:\\Files\\1_2_Shelf\\Test.csv"));
    String info = "";
    int startLine = 4;
    int endLine = 7;
    for (int i = 0; i < startLine; i++) {
        info = in.readLine();
    }
    for (int i = startLine; i < endLine + 1; i++) {
        info = in.readLine();
        System.out.println(info);
    
        String infoFields[] = info.split(",");
        System.out.println("infoFields[FIELD_SHELF_ID] = 
            " + infoFields[FIELD_SHELF_ID]);
    
        switch(infoFields[FIELD_SHELF_ID]) {
            case SHELF1:
                System.out.println("Found 1SHELF row"); break;
            case SHELF2:
                System.out.println("Found 2SHELF row"); break;
            default:
                System.out.println("Unknown shelf-type row"); break;
        }
    }
    
    in.close();
    

    如果您使用的是旧版本的 Java,则可以使用 if/else if/else 来代替 switch 语句,如下所示:

    if (infoFields[FIELD_SHELF_ID].equals(SHELF1)) {
        System.out.println("Found 1SHELF row");
    }
    else if (infoFields[FIELD_SHELF_ID].equals(SHELF2)) {
        System.out.println("Found 2SHELF row");
    }
    else {
        System.out.println("Unknown shelf-type row");
    }
    

    【讨论】:

    • 抱歉回复晚了,非常感谢您的快速回复。我正在使用 jdk1.6.32 并且对于 switch stmt IDE 要求我使用 jdk1.7 (无法为低于 1.7 的源级别打开字符串类型的值。只允许可转换的 int 值或枚举变量),我不能作为当前部署代码在 1.6
    • 我在答案末尾添加了一些代码,可以帮助您避免 switch 声明。
    • 请使用 CSV 解析器/阅读器,而不是仅仅使用逗号。
    猜你喜欢
    • 2013-06-27
    • 2013-08-18
    • 2021-09-14
    • 2023-03-11
    • 2010-12-05
    • 2016-03-06
    • 1970-01-01
    • 2015-10-26
    相关资源
    最近更新 更多