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