[JAVA] Ich habe ein Tool erstellt, um den Unterschied zwischen CSV-Dateien auszugeben

Obwohl es viele Tools gibt, die Dateiunterschiede vergleichen Ich hatte nicht was ich wollte Ich habe ein Tool erstellt, um den Unterschied zwischen zwei CSV-Dateien auszugeben.

Geben Sie die Schlüsselzeilennummer im Argument an. Es ist ein einfaches Werkzeug, das in einer anderen Zeile ausgegeben wird, wenn der Schlüsselwert unterschiedlich ist.

CSVDiff.java



import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 *CSV-Differenzausgang
 */
public class CSVDiff {

    private String split = null;

    /**
     *Trennzeichen
     */
    private String delimiter = null ;

    /**
     *Schlüsselelementindex
     ** 0 Start
     */
    private List<Integer> keyIndex = null;

    /**
     *Ordner zum Platzieren von Dateien importieren
     */
    private String inputDir = null ;

    /**
     *Datei importieren 1
     */
    private String inputFile1 = null ;

    /**
     *Datei importieren 2
     */
    private String inputFile2 = null ;

    /**
     *Ausgabeordner der Differenzdatei
     */
    private String outputDir = null ;

    /**
     * */
    private List<String[]> recordList1 = null;

    /**
     * */
    private List<String[]> recordList2 = null;

    private List <String>  outputList  = null ;

    /**
     *Konstrukteur
     * @param delimiterType Trennzeichentyp (1: außer Komma 1: Registerkarte)
     * @param args Schlüsselelementindex
     * @param inputDir Dateiplatzierungsordner importieren
     * @param inputFile1 Datei importieren 1
     * @param inputFile2 Datei importieren 2
     * @param outputDir Differenzdatei-Ausgabeordner
     */
    public CSVDiff(String delimiterType, String args, String inputDir, String inputFile1, String inputFile2,String outputDir) {

        //================================================================================
        //1. 1. Begrenzertyp Beurteilung
        //================================================================================
        if ("1".equals(delimiterType)) {
            this.delimiter = ",";
        } else {
            this.delimiter = "\t";
        }
        this.split = "*" + this.delimiter + "*" + this.delimiter + "*";

        //================================================================================
        //2. Konvertieren Sie den Schlüsselelementindex beim Vergleichen von Datensätzen mit einem Array
        //================================================================================
        this.keyIndex = new ArrayList<Integer> ();
        String arr[] = args.split(",");
        for (String item : arr) {
            int index = Integer.parseInt(item);
            if (! this.keyIndex.contains(index) ) {
                this.keyIndex.add(index);
            }
        }

        //================================================================================
        //3. 3. Legen Sie verschiedene Ordnernamen und Dateinamen fest
        //================================================================================
        this.inputDir   = inputDir;
        this.outputDir  = outputDir;
        this.inputFile1 = inputFile1;
        this.inputFile2 = inputFile2;
    }

    /**
     *
     * @param outputType
     * @param array1
     * @param array2
     * @return
     */
    private String makeRecord (int outputType,String[] array1 ,String[] array2) {
        StringBuilder outputRecord = new StringBuilder() ;

        if (outputType == 0) {
            //================================================================================
            //Datensatz 1 = Datensatz 2
            //→ Datensatz 1 und Datensatz 2 ausgeben
            //================================================================================

            //--------------------------------------------------------------------------------
            //Nehmen Sie 1 Ausgabe auf
            //--------------------------------------------------------------------------------
            for ( int i=0;i<array1.length;i++) {
                if (i == 0) {
                    outputRecord.append(array1[i]);
                } else {
                    outputRecord.append(this.delimiter + array1[i]);
                }
            }
            //--------------------------------------------------------------------------------
            //Trennzeichenausgabe
            //--------------------------------------------------------------------------------
            outputRecord.append(this.delimiter);
            outputRecord.append(split);

            //--------------------------------------------------------------------------------
            //Aufzeichnung 2 Ausgabe
            //--------------------------------------------------------------------------------
            for ( int i=0;i<array2.length;i++) {
                outputRecord.append(this.delimiter + array2[i]);
            }

        } else if (outputType == 1) {
            //================================================================================
            //Datensatz 1 <Datensatz 2
            //→ Nur Datensatz 1 ausgeben
            //================================================================================

            //--------------------------------------------------------------------------------
            //Nehmen Sie 1 Ausgabe auf
            //--------------------------------------------------------------------------------
            for ( int i=0;i<array1.length;i++) {
                if (i == 0) {
                    outputRecord.append(array1[i]);
                } else {
                    outputRecord.append(this.delimiter + array1[i]);
                }
            }
            //--------------------------------------------------------------------------------
            //Trennzeichenausgabe
            //--------------------------------------------------------------------------------
            outputRecord.append(this.delimiter);
            outputRecord.append(split);

            //--------------------------------------------------------------------------------
            //Aufnahme 2 (nur Komma oder Tabulator)
            //--------------------------------------------------------------------------------
            for ( int i=0;i<array1.length;i++) {
                outputRecord.append(this.delimiter);
            }

        }  else if (outputType == 2) {
            //================================================================================
            //Datensatz 1> Datensatz 2
            //→ Nur Datensatz 2 ausgeben
            //================================================================================

            //--------------------------------------------------------------------------------
            //1 Ausgabe aufzeichnen (nur Komma oder Tabulator)
            //--------------------------------------------------------------------------------
            for ( int i=0;i<array2.length;i++) {
                outputRecord.append(this.delimiter);
            }
            //--------------------------------------------------------------------------------
            //Trennzeichenausgabe
            //--------------------------------------------------------------------------------
//            outputRecord.append(this.delimiter);
            outputRecord.append(split);

            //--------------------------------------------------------------------------------
            //Aufzeichnung 2 Ausgabe
            //--------------------------------------------------------------------------------
            for ( int i=0;i<array2.length;i++) {
                outputRecord.append(this.delimiter + array2[i]);
            }
       }

        return outputRecord.toString();

    }


    /**
     *Ausgabe der CSV-Differenzliste
     * @return 0: Normale Beendigung 1: Abnormale Beendigung
     */
    protected int outputCSVDiff ()  {
        boolean isError = false ;

        // --------------------------------------------------------------------------------
        //(1) Import- / Ausgabedatei, Überprüfung der Ordnerexistenz
        // --------------------------------------------------------------------------------
        if (this.checkFileExists() != 0) {
            System.err.println("Datei oder Ordner für Import / Ausgabe existiert nicht");
            return 1;
        }

        // --------------------------------------------------------------------------------
        //(1) Datei lesen
        // --------------------------------------------------------------------------------
        if (this.readFile() != 0) {
            System.err.println("Fehler beim Lesen der Datei");
            return 1;
        }

        // --------------------------------------------------------------------------------
        //(2) Generierung der Ausgabeliste
        // --------------------------------------------------------------------------------
        this.outputList = new ArrayList<String> () ;
        int i_file1 = 0 ;
        int i_file2 = 0 ;

        while (i_file1 < this.recordList1.size() && i_file2 < this.recordList2.size()) {
            String[] record1 = this.recordList1.get(i_file1);
            String[] record2 = this.recordList2.get(i_file2);
            String   outputRecord = null ;


            if (record1.length != record2.length) {
                System.err.println("Es gibt einen Unterschied in der Anzahl der Datensätze zwischen Datei 1 und Datei 2.");
                isError = true ;
                break ;
            }

            //========================================================================
            //Key Item Match Urteil
            //========================================================================
            int diffType = 0 ;
            for (int keyIndex :this.keyIndex) {

                if (record1[keyIndex].compareTo(record2[keyIndex]) < 0 ) {
                    //Datei 1 Datensatz <Datei 2 Datensatz
                    diffType = 1;
                    break;
                } else if (record1[keyIndex].compareTo(record2[keyIndex]) > 0 ) {
                    //Datensatz Datei 1> Datensatz Datei 2
                    diffType = 2;
                    break;
                }
            }

            if (diffType == 0) {
                //Datei 1 Datensatz = Datei 2 Datensatz
                outputRecord = this.makeRecord(diffType, record1, record2) ;
                System.out.println(outputRecord);
                this.outputList.add(outputRecord);
                i_file1 ++;
                i_file2 ++;

            } else if (diffType == 1) {
                //Datei 1 Datensatz <Datei 2 Datensatz
                outputRecord = this.makeRecord(diffType, record1, null);
                System.out.println(outputRecord);
                this.outputList.add(outputRecord);
                i_file1 ++;
            } else {
                //Datensatz Datei 1> Datensatz Datei 2
                outputRecord = this.makeRecord(diffType, null, record2);
                System.out.println(outputRecord);
                this.outputList.add(outputRecord);
                i_file2 ++;
            }
        } // end-of-while

        if (isError) { return 1; }

        while (i_file1 < this.recordList1.size() ) {
            String[] record1 = this.recordList1.get(i_file1);
            String outputRecord = this.makeRecord(1, record1, null);
            System.out.println(outputRecord);
            this.outputList.add(outputRecord);
            i_file1 ++;
        }

        while (i_file2 < this.recordList2.size()) {
            String[] record2 = this.recordList2.get(i_file2);
            String outputRecord = this.makeRecord(2, null, record2) ;
            System.out.println(outputRecord);
            this.outputList.add(outputRecord);
            i_file2 ++;
        }

        // --------------------------------------------------------------------------------
        //(3) Dateiausgabe
        // --------------------------------------------------------------------------------
        this.writeFile();


         return 0 ;
    }

    private void writeFile () {
        FileOutputStream fos  = null;
        OutputStreamWriter osw = null;
        // --------------------------------------------------------------------------------
        //(1) Generierung des Zeitstempels der Ausgabedatei
        // --------------------------------------------------------------------------------
        Timestamp timestamp    = new Timestamp(System.currentTimeMillis());
        SimpleDateFormat sdf   = new SimpleDateFormat("yyyyMMddHHmmss");
        String fileName = "csvdiff_"+sdf.format(timestamp)+".txt" ;

        try {
            fos = new FileOutputStream(this.outputDir+"/"+fileName);
            osw = new OutputStreamWriter(fos,"Shift_JIS");

            for (String record : this.outputList) {
                osw.write(record + "\r\n") ;
            }
            osw.close();
            fos.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            if (osw != null ) {
                try {
                    osw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fos != null ) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }


        }


    }

    /**
     *Überprüfen Sie, ob Import- / Ausgabedateien und -ordner vorhanden sind
     * @Rückgabe 0: Import- / Ausgabedatei, mit Ordner 1: Import- / Ausgabedatei, Ordner existiert nicht
     */
    private int checkFileExists () {

        // --------------------------------------------------------------------------------
        //(1) Importprüfung der Existenz von Datei 1
        // --------------------------------------------------------------------------------
        File file1 = new File(this.inputDir+"/"+this.inputFile1) ;
        if (!file1.exists()) {
            System.err.println("Error->Datei 1 importieren ""+this.inputDir+"/"+this.inputFile1+""Ist nicht vorhanden! !!");
            return 1;
        }

        // --------------------------------------------------------------------------------
        //(2) Existenzprüfung für Datei 2 importieren
        // --------------------------------------------------------------------------------
        File file2 = new File(this.inputDir+"/"+this.inputFile2) ;
        if (!file2.exists()) {
            System.err.println("Error->Datei 2 importieren ""+this.inputDir+"/"+this.inputFile2+""Ist nicht vorhanden! !!");
            return 1;
        }

        // --------------------------------------------------------------------------------
        //(3) Überprüfen Sie den Platzierungsordner der Ausgabedatei
        // --------------------------------------------------------------------------------
        File outputDir = new File(this.outputDir) ;
        if (!outputDir.exists()) {
            System.err.println("Error->Ausgabeordner ""+this.outputDir+""Ist nicht vorhanden! !!");
            return 1;
        }
        return 0 ;
    }


    /**
     *Lesen Sie die Datei und legen Sie sie in der Array-Liste fest
     * @return 0: Read OK 1: NG lesen
     */
    private int readFile() {
        int retVal = 0 ;
        File file1 = new File(this.inputDir+"/"+this.inputFile1) ;
        File file2 = new File(this.inputDir+"/"+this.inputFile2) ;

        try {
            this.recordList1 = this.makeRecordList(file1);
            this.recordList2 = this.makeRecordList(file2);
        } catch (Exception e) {
            e.printStackTrace();
            retVal = 1;
        }
        return retVal;
    }

    /**
     *Füllen Sie den Inhalt der CSV-Datei in eine Array-Liste
     * @param file
     * @return
     * @throws Exception
     */
    private List<String[]> makeRecordList (File file) throws Exception {
        boolean isError = false;
        List<String[]> recordList  = new ArrayList<String[]>() ;

        FileInputStream   fis  = null;
        InputStreamReader isr  = null ;
        BufferedReader    br   = null ;

        try {
            fis   = new FileInputStream(file);
            isr   = new InputStreamReader(fis, Charset.forName("MS932"));
            br    = new BufferedReader(isr);

            int i = 1 ;
            String record = null ;
            while((record = br.readLine()) != null) {
                String[] recordArray = record.split(this.delimiter);

                System.out.println("["+i+"]Linie:"+Arrays.toString(recordArray));
                recordList.add(recordArray);
//                System.out.println("["+i_file1+"]Linie:"+record);
                i ++ ;
            }

        } catch(FileNotFoundException e ) {
            e.printStackTrace();
            isError = true;
        } catch(IOException e ) {
            e.printStackTrace();
            isError = true;
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                    isError = true;
                }
            }
            if (isr != null) {
                try {
                    isr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                    isError = true;
                }
            }
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                    isError = true;
                }
            }
        }
        if (isError) { throw new Exception(); }

        return recordList ;

    }

Das Folgende ist die Ausführungsklasse

CSVDiffExecute.java



/**
 *Ausführungsklasse für CSV-Differenzialausgabe
 *
 */
public class CSVDiffExecute {
    /**
     *Hauptmethode
     * @param args [0]Trennzeichentyp (1: Außer Komma 1: Tabulator)
     *              [1]Schlüsselelementindex (mehrere Spezifikationen können durch Kommas halber Breite getrennt angegeben werden)
     *              [2]Ordner zum Platzieren von Dateien importieren
     *              [3]Datei importieren 1
     *              [4]Datei importieren 2
     *              [5]Ausgabeordner der Differenzdatei
     */
    public static void main(String[] args) {
        //================================================================================
        //Argumentprüfung
        //================================================================================
        if (args.length != 6) {
            System.err.println("Error->Es gibt nicht genug Argumente.");
            System.exit(1);
        }
        //================================================================================
        //Ausführung der CSV-Differenzausgabe
        //================================================================================
        CSVDiff csvDiff = new CSVDiff(args[0], args[1], args[2], args[3], args[4], args[5]);
        csvDiff.outputCSVDiff();
    }
}


Recommended Posts

Ich habe ein Tool erstellt, um den Unterschied zwischen CSV-Dateien auszugeben
Ich habe ein Juwel gemacht, um den Text des Org-Modus in Qiita zu posten
Ich habe JAX-RS ausprobiert und mir das Verfahren notiert
Ich habe ein Tool zur Generierung von package.xml erstellt.
Als ich zu IntelliJ wechselte, gab es einen großen Unterschied in der Codierung der Eigenschaftendatei.
Ich möchte eine Liste des Inhalts einer Zip-Datei und ihrer unkomprimierten Größe erhalten
[chown] So ändern Sie den Eigentümer einer Datei oder eines Verzeichnisses
Ich habe eine GitHub-Aktion erstellt, die es einfach macht, das Ausführungsergebnis von RSpec zu verstehen
Ich habe ein neues Java-Bereitstellungstool erstellt
Finden Sie den Unterschied von einem Vielfachen von 10
Die Geschichte, zu vergessen, eine Datei in Java zu schließen und zu scheitern
Erstellen Sie eine U-Bahn-Karte von Tokio aus der CSV-Datei von station data.jp
So finden Sie heraus, welche Java-Version der Klassendatei kompiliert wurde
Ich habe ein Diff-Tool für Java-Dateien erstellt
Machen Sie einen Rand links vom TextField
Ich habe versucht, ein Personalmanagement-Tool zu entwickeln
Stellen Sie die Zeit von LocalDateTime auf eine bestimmte Zeit ein
Ich möchte den Inhalt der Absicht var_dump
Ausgabe der Verwendung der Slice-Methode
Ich habe einen Docker-Container erstellt, um Maven auszuführen
[Spring Batch] Gibt Tabellendaten in eine CSV-Datei aus
Ich war ein wenig süchtig nach dem S3-Prüfsummenvergleich, machen Sie sich also eine Notiz.
Ich habe ein Beispiel erstellt, wie ein Delegat in Swift UI 2.0 mit MapKit geschrieben wird
Ich habe es geschafft, ein Leerzeichen zu bekommen, als ich den Inhalt von Beans in den Textbereich gebracht habe
Ich möchte rekursiv die Oberklasse und die Schnittstelle einer bestimmten Klasse erhalten
Ich möchte eine Liste nur eindeutiger Zeichenfolgen erhalten, indem feste Zeichenfolgen vom Dateinamen ausgeschlossen werden
Ich möchte eine Methode einer anderen Klasse aufrufen
[Java] Ich möchte die Differenz zum Datum berechnen
Ich habe versucht, CSV mit Outsystems zu lesen und auszugeben
Ich war süchtig nach der Aufzeichnung des zugehörigen Modells
Konvertieren Sie das Array von error.full_messages in Zeichen und geben Sie es aus
Ich habe versucht, die Kapazität von Spring Boot zu reduzieren
Ich möchte den Namen des Posters des Kommentars anzeigen
Ich möchte eine bestimmte Datei mit WatchService überwachen
JavaFX - Geben Sie den Speicherort der CSS-Datei relativ zur fxml-Datei an
Die CSV-Datei, die ich herunterladen konnte, wurde plötzlich auf der Seite angezeigt.
Ich habe ein Sequenzdiagramm des j.u.c.Flow-Beispiels geschrieben
[Rails] Ich möchte das Linkziel von link_to auf einer separaten Registerkarte anzeigen
Ich möchte die MD5-Prüfsumme einer Datei in Java finden und das Ergebnis als Zeichenfolge in hexadezimaler Notation erhalten.
Beachten Sie, dass ich von den Einstellungen des Android-Projekts von IntelliJ IDEA abhängig war
Ich möchte die Bildlaufposition von UITableView zurückgeben!
Ich möchte die Protokollausgabe unter Android vereinfachen
Ich habe versucht, ein Tool zum Vergleichen von Amazon-Produktpreisen auf der ganzen Welt mit Java, der Amazon Product Advertising API und der Currency API (29.01.2017) zu erstellen.
Ich möchte der Kommentarfunktion eine Löschfunktion hinzufügen
Ich habe Togmarks gemacht, bei denen das zweite Jahr der Junior High School in einer Woche für ihre Ideen stimmen kann
[VBA] Ich habe ein Tool erstellt, um den primitiven Typ der von Hibernate Tools generierten Entity-Klasse in den entsprechenden Referenztyp zu konvertieren.
Ich möchte herausfinden, welche Java-Version die JAR-Datei hat, die ich habe
Ich habe versucht, die Beispielanwendung gemäß der Idee des Buches "Micro Service Architecture" in einen Mikrodienst zu verwandeln.
So fordern Sie mit jMeter eine CSV-Datei als JSON an
Ich habe die Serverseite des Online-Kartenspiels gemacht made
Hat die Serverseite des Online-Kartenspiels gemacht ⑤
Ich habe die Serverseite des Online-Kartenspiels gemacht made
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen