2016-11-15 13 views
0

2つのcsvファイル(old.csv、change.csv)を比較する方法と、別の操作を実行した後で、更新、削除)すると、new.csvファイルが生成されます。私はちょうどこれを行う方法のアイデアが必要です。私はFileReaderとWriterを使ってファイルを読み書きすることができました。私はファイルを比較し、操作を実行する方法を知らない。私はデータエントリのために配列を使うべきです。2 csvファイルを比較して操作を実行し、新しいcsvファイルに出力する

私のCSVファイルには、列が含まれています

Old.csv 
CODE NAME ADDRESS NUMBER 
0001 John USA  1234 

Change.csv 
CHANGE CODE NAME ADDRESS NUMBER 
ADD  0002 Shane Germany 5678 
UPDATE 0001   Canada 

New.csv 
CODE NAME ADDRESS NUMBER 
0001 John Canada 1234 
0002 Shane Germany 5678 

アイデアを助けてください。前もって感謝します。

+0

ファイル構造を自分で決定できますか?もしそうなら、データセットを識別するためにIDを追加することをお勧めします。それ以外の場合は、同じ名前を2回使用すると問題が発生します。それとも、数値列は何を意味するのでしょうか? csvをMySQLデータベースにインポートすることを検討しましたか?これにより、SQL-Languageを使用してデータエントリを変更することができます。 – Gildraths

+0

主キーはCODENUMBERです。申し訳ありません、追加するのを忘れました。私はデータエントリの代わりにSQLを使うべきではありません。 – exceptione

答えて

0

。以下は

はopencsvを使った例です:

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; 
    } 
} 

と2つのファイルを比較して、新しいを作成するには、アプリケーションでデータホルダーとしてクラスの上に使用します。

は、次のようになりますクラスを作成します。 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();      
    } 
} 
+0

よろしく!私はこれを使用します。どうもありがとうございました!私はついに悟りました:D – exceptione

0

名前列は2つのcsvファイル間の主キーです.CSVファイルを読み込むと、タイプのハッシュマップを作成できます。Name = Name coulmn value、Dataはオブジェクト全体です。後で各変更CSVレコードをトラバースしながら、変更を処理するswitch文を持つことができます。それぞれの場合、ハッシュマップに対する個々の更新を管理できます。ハッシュマップに成功した後、ハッシュマップに必要な更新されたインスタンスが含まれます。このインスタンスは、新しいcsvに移動して隠すことができます。私はopencsvまたは

supercsvのようなCSVパーサーを使用し、データクラスを利用することを提案するようなタスクのために

関連する問題