在命令行中以制表符分隔 java 的 CSV
CSV to tab delimited java in command line
更新代码。这个程序应该获取 CSV 文件并按学校将其分成 TSV 文件,但我没有让它工作。我正在使用它来正确创建文件,但只有一个文件中有任何数据...
public class Student implements Comparable<Student>{
public int id = 0;
public String name = "";
public String school = "";
public Student(int id, String name, String school){
this.id = id;
this.name = name;
this.school = school;
}
public String toString(){
return id+"\t"+name+"\t"+school;
}
@Override
public int compareTo(Student o) {
return this.school.compareTo(o.school);
}
}
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
public class ReadCSV {
public static String CSV_FILE_PATH = "/Users/eringray/Desktop/csvtotab/input.csv";
public static void main(String[] args){
try {
BufferedReader br = new BufferedReader(new FileReader(CSV_FILE_PATH));
BufferedWriter bw = new BufferedWriter(new FileWriter(CSV_FILE_PATH + ".tsv"));
ArrayList<Student> list = new ArrayList<Student>();
String line = "";
while((line = br.readLine()) != null) {
String[] values = line.split(",");
if(values.length == 3) {
String idAsString = values[0];
String name = values[1];
String school = values[2];
int id = Integer.parseInt(idAsString);
Student s = new Student(id, name, school);
list.add(s);
}
}
Collections.sort(list);
String currentSchool = "";
for(int i = 0; i < list.size(); i++){
Student stu = list.get(i);
if(currentSchool != stu.school){
currentSchool = stu.school;
bw = new BufferedWriter(new FileWriter(CSV_FILE_PATH + stu.school + ".tsv"));
}
String lineText = stu.toString();
bw.write(lineText);
bw.newLine();
}
br.close();
bw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
您要做的第一件事是读取输入文件。
我认为,您需要逐行阅读它(取决于文件结构)。
https://docs.oracle.com/javase/7/docs/api/java/io/FileInputStream.html
https://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html
下一步是分离数据并按学校排序(如果我理解你的问题)。
为此,您必须拆分数据并创建一个 class 来存储信息:
https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split(java.lang.String)
public Class Student{
public String name = "";
....
public Student(String name, String school, ...){}
}
当您为列表中的每个学生创建了 Student 对象后,您必须按学校对学生进行排序:
您可以实现 compareable 并使用 Collection.sort()。
https://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html
最后一件事是打印输出,为此你必须覆盖学生的 toString 方法 class:
public String toString(){
return this.id+"\t"+this.name+"\t"+this.school;
}
遍历学生列表并调用 toString 方法:
System.out.println(students.get(i).toString());
编辑:
如果您需要在文件中而不是在控制台中输出,只需使用 fileoutputStream and a bufferedwriter 在文件中打印 toString 方法的输出。
更新代码。这个程序应该获取 CSV 文件并按学校将其分成 TSV 文件,但我没有让它工作。我正在使用它来正确创建文件,但只有一个文件中有任何数据...
public class Student implements Comparable<Student>{
public int id = 0;
public String name = "";
public String school = "";
public Student(int id, String name, String school){
this.id = id;
this.name = name;
this.school = school;
}
public String toString(){
return id+"\t"+name+"\t"+school;
}
@Override
public int compareTo(Student o) {
return this.school.compareTo(o.school);
}
}
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
public class ReadCSV {
public static String CSV_FILE_PATH = "/Users/eringray/Desktop/csvtotab/input.csv";
public static void main(String[] args){
try {
BufferedReader br = new BufferedReader(new FileReader(CSV_FILE_PATH));
BufferedWriter bw = new BufferedWriter(new FileWriter(CSV_FILE_PATH + ".tsv"));
ArrayList<Student> list = new ArrayList<Student>();
String line = "";
while((line = br.readLine()) != null) {
String[] values = line.split(",");
if(values.length == 3) {
String idAsString = values[0];
String name = values[1];
String school = values[2];
int id = Integer.parseInt(idAsString);
Student s = new Student(id, name, school);
list.add(s);
}
}
Collections.sort(list);
String currentSchool = "";
for(int i = 0; i < list.size(); i++){
Student stu = list.get(i);
if(currentSchool != stu.school){
currentSchool = stu.school;
bw = new BufferedWriter(new FileWriter(CSV_FILE_PATH + stu.school + ".tsv"));
}
String lineText = stu.toString();
bw.write(lineText);
bw.newLine();
}
br.close();
bw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
您要做的第一件事是读取输入文件。 我认为,您需要逐行阅读它(取决于文件结构)。
https://docs.oracle.com/javase/7/docs/api/java/io/FileInputStream.html
https://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html
下一步是分离数据并按学校排序(如果我理解你的问题)。
为此,您必须拆分数据并创建一个 class 来存储信息:
https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split(java.lang.String)
public Class Student{
public String name = "";
....
public Student(String name, String school, ...){}
}
当您为列表中的每个学生创建了 Student 对象后,您必须按学校对学生进行排序:
您可以实现 compareable 并使用 Collection.sort()。
https://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html
最后一件事是打印输出,为此你必须覆盖学生的 toString 方法 class:
public String toString(){
return this.id+"\t"+this.name+"\t"+this.school;
}
遍历学生列表并调用 toString 方法:
System.out.println(students.get(i).toString());
编辑:
如果您需要在文件中而不是在控制台中输出,只需使用 fileoutputStream and a bufferedwriter 在文件中打印 toString 方法的输出。