gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:05:01 28 4
gpt4 key购买 nike

我是 Java 编程新手,我的任务是解析 CSV 文件并通过比较列(例如,列)打印出 CSV 文件的正确行。打印的行需要有唯一的第一列和第二列,第三列必须包含“no”,第四列的值大于或等于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();
}
}
}
}

}

编辑示例 CSV:

例如,示例 CSV 文件如下所示:

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

因此,代码必须获取 CSV 文件,然后打印出具有唯一名称(第一列)、唯一 IP(第二列)、“否”表示“正在工作?”的行。 (第 3 列)且版本值高于 12。

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

非常感谢您的建议!

最佳答案

您的问题中的要求相当困惑,如果没有示例 CSV 数据,事情就不会变得更容易。令人困惑的部分与关于唯一性的第 1 列和第 2 列数据有关。您认为什么是独特

A) 是否唯一,因为第 1 列和/或第 2 列包含在任何其他 CSV 文件行中不重复的字符串或数值(在其各自的列)?

B) 或者它是唯一的,因为第 1 列和/或第 2 列包含一个字符串或数值,该字符串或数值本身是唯一的,并且可以在其他 CSV 文件行中找到(< em>在其各自的列中允许重复)?

下面的示例代码假定唯一条件 (A)。这意味着,如果 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

因为只有这两行的第 1 列和第 2 列对于整个 CSV 文件来说是唯一的。你能看到它们是哪一行吗?

这里是示例代码:

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 数据类型假设,但确实需要更改代码,因为我现在知道第四个数据列包含 Double 数据类型值。

您需要更改以下代码行:

int col4Value = Integer.parseInt(data[3]);

到处理 Double 数据类型值的代码行:

double col4Value = Double.parseDouble(data[3]);

当您修改代码以满足您的需求时,这应该会对您有所帮助。

关于Java:如何比较 CSV 文件的列并打印特定行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41353900/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com