我是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
我不确定使用什么数据结构来比较列。
我非常感谢任何建议!
您的问题中的要求相当混乱,如果没有示例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计算列记录。请帮忙。