当前位置: 首页 > 知识库问答 >
问题:

Java:如何比较CSV文件的列并打印特定行

姜博
2023-03-14

我是Java编程的新手,我的任务是解析CSV文件并通过比较列打印出CSV文件的正确行,例如打印的行需要有唯一的第1和第2列,第3列必须包含“no”,第4列的值大于或等于12。

共5列。

此外,我不允许使用任何为您解析CSV的库。

private static String[] routerData;

public static void main(String [] args)  {

    // Input of file which needs to be parsed
    String csvFile = "./sample.csv";
    BufferedReader csvReader = null;

    // Data split by ',' in CSV file
    String line = null;
    String csvSplitBy = ",";

    try {

        // Create the CSV file reader
        csvReader = new BufferedReader(new FileReader(csvFile));
        while ((line = csvReader.readLine()) !=null) {

            routerData = line.split(csvSplitBy, -1);
            System.out.println(routerData[0] + ", " + routerData[1] + ", " + routerData[2] + ", " + routerData[3] + ", " + routerData[4]);

        }

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (csvReader != null) {
            try {
                csvReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
Name,IP,Working?,Version,Comments
name,0.0.0.0,No,11.2,Some GUI Bugs
name2,0.1.2.0,Yes,12.3,
name,0.0.1.0,Yes,12.2,Case broken,
name4,0.0.0.0,no,10.3

我不确定使用什么数据结构来比较列。

我非常感谢任何建议!

共有1个答案

谢同化
2023-03-14

您的问题中的要求相当混乱,如果没有示例CSV数据,事情不会变得更容易。混淆部分与关于唯一性的第1列和第2列数据有关。你认为什么是独一无二的?

A)从列1和/或列2包含的字符串或数值在任何其他CSV文件行中没有重复(在其相应列中没有重复)的意义上来说,它是否是唯一的?

B)还是在列1和/或列2包含一个字符串或数值的意义上是唯一的,该字符串或数值本身是唯一的,并且可以在其他CSV文件行中找到(在其各自的列中允许重复)?

Jack,Flash,yes,14,Unknown Value
Bob,Stick,no,11,Unknown Value
Jack,Flash,no,22,Unknown Value
Fred,Frog,yes,6,Unknown Value
Bob,Stick,no,32,Unknown Value
Tracey,Jones,no,17,Unknown Value
Fred,Frog,no,23,Unknown Value
John,Brown,no,12,Unknown Value
Bob,Stick,yes,88,Unknown Value

下面是示例代码

ArrayList<String> resultList = new ArrayList<>();
ArrayList<String> linesList = new ArrayList<>();
// Input of file which needs to be parsed
String csvFile = "sample.csv";
BufferedReader csvReader;

// Data split by ',' in CSV file
String csvSplitBy = ",";
try {
    // Read the CSV file into an ArrayList array for easy processing.
    String line;
    csvReader = new BufferedReader(new FileReader(csvFile));
    while ((line = csvReader.readLine()) !=null) {
        linesList.add(line);
    }
    csvReader.close();
} 
catch (IOException e) { e.printStackTrace(); } 

// Process each CSV file line which is now contained within
// the linesList list Array
for (int i = 0; i < linesList.size(); i++) {
    String[] data = linesList.get(i).split(csvSplitBy);
    String col1 = data[0];
    String col2 = data[1];
    String col3YesNo = data[2];
    //int col4Value = Integer.parseInt(data[3]);  //WAS THIS
    double col4Value = Double.parseDouble(data[3]); // *** SHOULD BE ***
    String col5Unknown = data[4];

    // Determine if Column 1 and Column 2 data for the 
    // current line is unique to the entire CSV file.
    boolean columns1And2AreUnique = true;
    for (int j = 0; j < linesList.size(); j++) {
        String[] tmp = linesList.get(j).split(csvSplitBy);
        // Make sure we don't process the same line we are on...
        if (j != i) {
            if (col1.equals(tmp[0]) || col2.equals(tmp[1])) { 
                columns1And2AreUnique = false; 
                break;
            }
        }
    }
    if (columns1And2AreUnique && col3YesNo.equalsIgnoreCase("no") && col4Value >= 12.0) {
        resultList.add(linesList.get(i));
    }
}

// Display the determined results from the CSV file.
if (resultList.isEmpty()) {
    System.out.println("There could be no data results gathered from the supplied\n"
                     + "CSV file which meets the required criteria.");
}
else {
    System.out.println("Column 1\tColumn 2\tColumn 3\tColumn 4\tColumn 5");
    System.out.println("================================================"
                     + "========================\n");
    String padString = "        "; //Used for simple space padding in display
    for (int i = 0; i < resultList.size(); i++) {
        String[] tmp = resultList.get(i).split(csvSplitBy);
        System.out.println(tmp[0] + padString.substring(tmp[0].length()) + "\t" 
                         + tmp[1] + padString.substring(tmp[1].length()) + "\t" 
                         + tmp[2] + padString.substring(tmp[2].length()) + "\t"
                         + tmp[3] + padString.substring(tmp[3].length()) + "\t"
                         + tmp[4]);
    }
}

编辑:现在您已经发布了CSV文件中的一些示例数据...

好吧,我非常接近于我的柱状CSV数据类型假设,但确实需要对代码进行更改,因为我现在知道第4个数据列包含双数据类型值。

int col4Value = Integer.parseInt(data[3]);
double col4Value = Double.parseDouble(data[3]);
 类似资料:
  • 问题内容: 我需要比较两个CSV文件并在第三个CSV文件中打印出差异。在我的情况下,第一个CSV是一个名为old.csv的哈希表的旧列表,第二个CSV是包含新旧哈希表的新哈希表。 这是我的代码: 第三个文件是旧文件的副本,而不是更新文件。怎么了 ?我希望你能帮助我,非常感谢! PS:我不想使用diff 问题答案: 问题在于您正在将中的每一行与中的同一行进行比较。只要一个文件中有多余的一行,您就会发

  • 我正在创建一个项目,其中我需要从. java文件中的关键字开始读取特定行。 我将不得不阅读. java文件以获取: 我将如何读取代码中的这两行代码。我应该为此设置regex吗? 我正在使用: 据我所知,Intent关键字在每个文件中都是静态的,因此我可以获得像“Intent”这样的行的开头,但如何仅从大文件中读取这一行和下一行…?

  • 我正在用我的“CsvReader”读取csv文件,如下所示: 我使用的csv如下所示: 雇员的dataVO看起来像 包com。cg。dto; 公营雇员{ 字符串empId; 字符串名称; 薪酬; 公共字符串getEmpId(){ 返回empId; } public void setEmpId(字符串empId){ 这empId=empId; } 公共字符串 返回empName; } public

  • 问题内容: 我有一个文本文件,需要将其打印到特定的网络打印机。我知道打印机的名称。 到目前为止,我已经创建了Printable类来打印文件(票证)。 我这样称呼TicketPrintPage: 它的工作原理还不错,但是: -我的文本不多于一页(找到了一些算法,但是很好) -我不知道打印机何时完成打印,如果我尝试打印两页如果打印机连续打印了多张票证,则会返回“打印机未就绪”消息。 所以问题又来了:没

  • 我正在使用下面的命令获取前1000行数据: 但是,我如何调整这个命令来获取数据范围。例如,提取行700到900之间的间隔。 还有一件事,我怎么能只导出几个变量。例如,我的数据库有120列,但我只想保存变量年份(第1列)、出生日期(第4列)和起源状态(第100列)。

  • 我有一个csv文件,其中包含4个字段(列)。在4列中,我想读第二列,想读csv文件的特定列的第一个名称,并使用Java计算列记录。请帮忙。