Prüfen Sie, ob eine große Datei eine andere (kleinere) Datei enthält

416
Angelo

Ich habe eine 3MB- und eine 5MB-Textdatei. Ich möchte sicherstellen, dass die größere Datei alle Zeilen enthält, die sich in einer kleineren Datei befinden.

Die Ausgabe muss alle Zeilen der kleineren Datei anzeigen, die nicht in der größeren Datei enthalten sind. Ich versuche, sie mit Notepad ++ zu vergleichen, aber es hängt. Der Vergleich von Word 2007 ist schwer zu verstehen.

Ich habe Beyond Compare und WinMerge und fc und vieles mehr ausprobiert. Zeilen sind in zwei Dateien nicht in derselben Reihenfolge - das Vergleichswerkzeug sagt, dass die Zeile sich unterscheidet, aber dieselbe Zeile ist an einer anderen Stelle in der großen Datei vorhanden. Denke, kleine Datei ist so -

abc def ghi jkl mno pqr yza bcd 

Denke, große Datei ist so -

efg hij mno pqr ghi jkl abc def stu vwx 

Ich möchte diese Ausgabe -

yza bcd 
2
Anscheinend handelt es sich dabei um Textdateien. Versuchen Sie es mit verschiedenen Texteditoren wie Scite und möglicherweise einem Online-Dienstprogramm. Martín Canaval vor 11 Jahren 0
PowerShell kann dies wahrscheinlich tun, aber Sie müssen etwas googeln. Sam Axe vor 11 Jahren 0
@ Dan-o: Ja, das denke ich auch !!! Ich füge Batch Powershell vbscript der Frage hinzu, aber TFM entfernt es aus irgendeinem Grund. Aber ich frage hier nach google nach, wo ich nur Linux-Antworten sehe (die ich auch sage, aber TFM entfernen). Angelo vor 11 Jahren 0
these should get you headed in the right direction: http://answers.oreilly.com/topic/1989-how-to-search-a-file-for-text-or-a-pattern-in-windows-powershell/ and http://blogs.technet.com/b/heyscriptingguy/archive/2011/10/09/use-a-powershell-cmdlet-to-count-files-words-and-lines.aspx Sam Axe vor 11 Jahren 0
Ich habe die Tags [Powershell] und [Vbscript] entfernt, da Sie sie in Ihrer ursprünglichen Frage nicht erwähnt hatten, und Sie sollten nach einer Lösung fragen und nicht vorschlagen, was Sie ausdrücklich versuchen möchten. Wenn Sie Ihren Anwendungsbereich auf bestimmte Technologien beschränken, begrenzen Sie auch die Vorschläge. TFM vor 11 Jahren 0

2 Antworten auf die Frage

3
ubiquibacon

Die Verwendung eines Vergleichstools wie Beyond Compare, KDiff3 oder Perforce sollte ausreichen.

AKTUALISIEREN:

Ich habe mich heute Morgen großzügig gefühlt, also habe ich das für Sie zusammengeworfen. Sollte tun, was du willst.

enter image description here

Einige Notizen:

1.) Dieser Code behandelt Duplikate. Wenn beispielsweise eine Zeile mit demselben Text in der kleinen Datei zweimal vorkommt, wird erwartet, dass sie in der großen Datei zweimal vorkommt.

2.) Dieser Code ignoriert die Zeilenreihenfolge gemäß Ihrem Anwendungsfall.

3.) Kleiner Fehler bezüglich Leerzeilen am Ende einer Datei, mit dem ich mich nicht anfreunden wollte. Dieser Code behandelt eine Leerzeile wie jede andere Zeile als Zeile, solange sich diese nicht am Ende der Datei befindet. In diesem Fall ist eine Leerzeile zulässig (und wird ignoriert). Ein Beispiel: Wenn die kleine Datei 3 leere Zeilen am Ende der Datei und keine weiteren leeren Zeilen hat, wird erwartet, dass die große Datei mindestens 2 leere Zeilen in der Mitte der anderen Zeilen oder 3 leere Zeilen in der Datei enthält Ende der Datei.

Zu rennen:

1.) Stellen Sie sicher, dass Sie ein JDK installiert haben

2.) Stellen Sie sicher, dass Java in Ihrem Pfad ist. Wenn Sie sich auf einem Windows-System befinden, gehen Sie zu Systemsteuerung> System> Erweiterte Systemeinstellungen> Umgebungsvariablen und wählen Sie Pathim Abschnitt Systemvariablen. Hängen Sie den Pfad Ihres JDK-Bin-Ordners an die Pfadvariable an. Stellen Sie sicher, dass Sie ihn durch ein Semikolon vom vorherigen Eintrag trennen.

C:\Program Files (x86)\Java\jdk1.6.0_38\bin;

3.) Kopieren Sie den Code in eine Datei mit dem Namen FileLineComparator.java

4.) Öffnen Sie eine Eingabeaufforderung und navigieren Sie zu dem Verzeichnis mit der gerade erstellten Datei

5.) Typ javac FileLineComparator.java

6.) Typ java -cp . FileLineComparator

7.) Viel Spaß!

import java.io.*; import java.util.ArrayList; import javax.swing.JFileChooser; import javax.swing.JOptionPane;  public class FileLineComparator extends javax.swing.JFrame {  public FileLineComparator() { initComponents(); }  @SuppressWarnings( "unchecked" ) // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() {  fileChooser = new javax.swing.JFileChooser(); smallFileTextField = new javax.swing.JTextField(); smallFileLabel = new javax.swing.JLabel(); largeFileLabel = new javax.swing.JLabel(); largeFileTextField = new javax.swing.JTextField(); outputFileLabel = new javax.swing.JLabel(); outputFileTextField = new javax.swing.JTextField(); goButton = new javax.swing.JButton(); smallFileButton = new javax.swing.JButton(); largeFileButton = new javax.swing.JButton(); outputFileButton = new javax.swing.JButton();  setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);  smallFileLabel.setText("Small text file:");  largeFileLabel.setText("Large text file:");  outputFileLabel.setText("Output file:");  goButton.setText("Go!"); goButton.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { goButtonMouseClicked(evt); } });  smallFileButton.setText("Browse"); smallFileButton.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { smallFileButtonMouseClicked(evt); } });  largeFileButton.setText("Browse"); largeFileButton.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { largeFileButtonMouseClicked(evt); } });  outputFileButton.setText("Browse"); outputFileButton.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { outputFileButtonMouseClicked(evt); } });  javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(largeFileLabel) .addComponent(smallFileLabel)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) .addComponent(outputFileTextField, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 194, Short.MAX_VALUE) .addComponent(largeFileTextField, javax.swing.GroupLayout.Alignment.LEADING) .addComponent(smallFileTextField))) .addComponent(outputFileLabel)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(largeFileButton) .addComponent(smallFileButton) .addComponent(outputFileButton))) .addComponent(goButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap(16, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(smallFileTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(smallFileLabel) .addComponent(smallFileButton)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(largeFileLabel) .addComponent(largeFileTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(largeFileButton)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(outputFileTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(outputFileLabel) .addComponent(outputFileButton)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(goButton, javax.swing.GroupLayout.PREFERRED_SIZE, 62, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) );  pack(); }// </editor-fold>  private void smallFileButtonMouseClicked( java.awt.event.MouseEvent evt ) { setSelectedFile( FILE_TYPES.SMALL ); }  private void largeFileButtonMouseClicked( java.awt.event.MouseEvent evt ) { setSelectedFile( FILE_TYPES.LARGE ); }  private void outputFileButtonMouseClicked( java.awt.event.MouseEvent evt ) { setSelectedFile( FILE_TYPES.OUTPUT ); }  private void goButtonMouseClicked( java.awt.event.MouseEvent evt ) { errorStub = new StringBuilder(); smallFile = new File( smallFileTextField.getText() ); smallFileTextField.setText( smallFile.getAbsolutePath() ); largeFile = new File( largeFileTextField.getText() ); largeFileTextField.setText( largeFile.getAbsolutePath() ); outputFile = new File( outputFileTextField.getText() ); outputFileTextField.setText( outputFile.getAbsolutePath() ); process(); }  private void setSelectedFile( FILE_TYPES fileType ) { int returnVal = fileChooser.showOpenDialog( null ); if( returnVal == JFileChooser.APPROVE_OPTION ) { File file = fileChooser.getSelectedFile(); switch( fileType ) { case SMALL: smallFileTextField.setText( file.getPath() ); break; case LARGE: largeFileTextField.setText( file.getPath() ); break; case OUTPUT: outputFileTextField.setText( file.getPath() ); break; } } }  private void process() { ArrayList<String> smallFileLines = readFileLines( smallFile ); ArrayList<String> largeFileLines = readFileLines( largeFile ); ArrayList<String> outputFileLines = new ArrayList<String>();  for( String line : smallFileLines ) { if( !largeFileLines.contains( line ) ) { outputFileLines.add( line ); } else { largeFileLines.remove( line ); } }  if( errorStub.length() == 0 ) { writeOutput( outputFileLines ); }  if( errorStub.length() == 0 ) { JOptionPane.showMessageDialog( null, "Finished Successfully!" ); } else { JOptionPane.showMessageDialog( null, errorStub.toString() ); } }  private ArrayList<String> readFileLines( File file ) { ArrayList<String> al = new ArrayList<String>(); try { FileReader fr = new FileReader( file ); BufferedReader bufRdr = new BufferedReader( fr ); String line = null; while( ( line = bufRdr.readLine() ) != null ) { al.add( line ); } bufRdr.close(); } catch( IOException ioex ) { errorStub.append( String.format( "Error reading file %s\r\n", file.getAbsolutePath() ) ); System.err.println( ioex.getMessage() ); } return al; }  private void writeOutput( ArrayList<String> outputFileLines ) { try { FileWriter fw = new FileWriter( outputFile ); BufferedWriter bw = new BufferedWriter( fw ); for( int i = 0; i < outputFileLines.size(); i++ ) { String line = String.format( "%s%s", outputFileLines.get( i ), i + 1 == outputFileLines.size() ? "" : "\r\n" ); bw.write( line ); } bw.close(); } catch( Exception ex ) { errorStub.append( String.format( "Error writing file %s\r\n", outputFile.getAbsolutePath() ) ); System.err.println( ex.getMessage() ); } }  public static void main( String args[] ) { try { for( javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels() ) { if( "Nimbus".equals( info.getName() ) ) { javax.swing.UIManager.setLookAndFeel( info.getClassName() ); break; } } } catch( ClassNotFoundException ex ) { java.util.logging.Logger.getLogger( FileLineComparator.class.getName() ).log( java.util.logging.Level.SEVERE, null, ex ); } catch( InstantiationException ex ) { java.util.logging.Logger.getLogger( FileLineComparator.class.getName() ).log( java.util.logging.Level.SEVERE, null, ex ); } catch( IllegalAccessException ex ) { java.util.logging.Logger.getLogger( FileLineComparator.class.getName() ).log( java.util.logging.Level.SEVERE, null, ex ); } catch( javax.swing.UnsupportedLookAndFeelException ex ) { java.util.logging.Logger.getLogger( FileLineComparator.class.getName() ).log( java.util.logging.Level.SEVERE, null, ex ); }  java.awt.EventQueue.invokeLater( new Runnable() {  public void run() { new FileLineComparator().setVisible( true ); } } ); }  private enum FILE_TYPES { SMALL, LARGE, OUTPUT }  private File smallFile = null; private File largeFile = null; private File outputFile = null;  private StringBuilder errorStub = null;  // Variables declaration - do not modify private javax.swing.JFileChooser fileChooser; private javax.swing.JButton goButton; private javax.swing.JButton largeFileButton; private javax.swing.JLabel largeFileLabel; private javax.swing.JTextField largeFileTextField; private javax.swing.JButton outputFileButton; private javax.swing.JLabel outputFileLabel; private javax.swing.JTextField outputFileTextField; private javax.swing.JButton smallFileButton; private javax.swing.JLabel smallFileLabel; private javax.swing.JTextField smallFileTextField; // End of variables declaration } 
Ich werde die Empfehlung von Beyond Compare, meiner Meinung nach, das beste Vergleichstool auf dem Markt vertreten. wonea vor 11 Jahren 2
Ja, Beyond Compare ist zwar nicht perfekt, ist aber definitiv einer der besten. Daniel R Hicks vor 11 Jahren 0
Ich mag Java nicht und entferne es nach der letzten Warnung (alle Websites, die ich verwende, verwende Flash, also kein Problem), aber ich werde den Laptop eines Freundes mit Java anprobieren. Vielen Dank und ich akzeptiere es, wäre aber nett, wenn jemand eine VBScript- oder Powershell-Antwort erhält. Angelo vor 11 Jahren 0
Die jüngsten Warnungen in Bezug auf Java beziehen sich nur auf Java 7. Halten Sie sich jetzt für Java 6. Sie benötigen auch das JDK, um diesen Code zu kompilieren und auszuführen, nicht nur eine Standardinstallation der JRE. ubiquibacon vor 11 Jahren 0
0
Chris Nava

WinMerge is great for comparing text files.