.
이 같은 모습 클래스 만들기 :
public class Person {
private String code;
private String name;
private String address;
private String number;
public Person(String code, String name, String address, String number) {
this.code = code;
this.name = name;
this.address = address;
this.number = number;
}
public String geCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
}
을하고 두 파일을 비교하는 응용 프로그램에서 데이터 홀더와 같은 클래스 이상 사용하고 새로 만들기를 아래
는 opencsv 사용 예입니다 CSV 파일
import com.opencsv.CSVReader;
import com.opencsv.CSVWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
public class NewClass1 {
public static void main(String[] args) {
try {
String oldFile = "Old.csv";
String changeFile = "Change.csv";
String newFile = "New.csv";
Map<String,Person> personsList = readOldCsv(oldFile);
personsList = getChangesfromChangeCsv(changeFile,personsList);
writeNewCsvFile(newFile,personsList);
} catch (IOException ex) {
ex.printStackTrace();
}
}
//read your old csv file line by line and create an object person
//and put it in a map with code as key and person itself as value
//here assumed that your files are tab separeted '\t';
//if not change to ';' or ',' according to your separator
public static Map<String,Person> readOldCsv(String fileName) throws IOException{
Map<String,Person> personsList = new HashMap<>();
String [] nextLine;
CSVReader reader = new CSVReader(new FileReader(fileName), '\t' ,'\'', 1);
while ((nextLine = reader.readNext()) != null) {
personsList.put(nextLine[0],new Person(nextLine[0], nextLine[1], nextLine[2], nextLine[3]));
}
return personsList;
}
// read your change csv file and add or update persons depending on the change column
public static Map<String,Person> getChangesfromChangeCsv(String fileName, Map<String,Person> personsList) throws IOException{
String [] nextLine;
CSVReader reader = new CSVReader(new FileReader(fileName), '\t' ,'\'', 1);
while ((nextLine = reader.readNext()) != null) {
switch(nextLine[0].toLowerCase()){
case "add":
personsList.put(nextLine[1],new Person(nextLine[1], nextLine[2], nextLine[3], nextLine[4]));
case "update":
personsList.get(nextLine[1]).setName(!nextLine[2].isEmpty()? nextLine[2]:personsList.get(nextLine[1]).getName());
personsList.get(nextLine[1]).setAddress(!nextLine[3].isEmpty()? nextLine[3]:personsList.get(nextLine[1]).getAddress());
personsList.get(nextLine[1]).setNumber(!nextLine[4].isEmpty()? nextLine[4]:personsList.get(nextLine[1]).getNumber());
default:
System.out.println("unexpected entry");
}
}
// use TreeMap to get a map sorted by key
return new TreeMap<>(personsList);
}
//write the values of the map into a new csv file
private static void writeNewCsvFile(String filename,Map<String,Person> personsList) throws IOException {
CSVWriter writer = new CSVWriter(new FileWriter(filename,false), '\t',CSVWriter.NO_QUOTE_CHARACTER);
for(Person p : personsList.values()){
String[] entries = {p.geCode(),p.getName(),p.getAddress(),p.getNumber()};
writer.writeNext(entries);
}
writer.close();
}
}
파일 구조를 직접 결정할 수 있습니까? 그렇다면 ID를 추가하여 데이터 집합을 식별 할 것을 제안합니다. 그렇지 않으면 동일한 이름을 가진 즉시 문제가 발생합니다. 아니면 숫자 열이 의도 한 것입니까? csv를 MySQL 데이터베이스로 가져 오는 것을 고려 했습니까? 이 방법으로 SQL-Language를 사용하여 데이터 항목을 변경할 수 있습니다. – Gildraths
기본 키는 CODENUMBER입니다. 죄송합니다. 추가하지 않았습니다. 나는 대신 데이터 엔트리를 위해 SQL 배열을 사용해야한다. – exceptione