Проверьте, содержит ли большой файл другой (меньший) файл

318
Angelo

У меня есть 3 МБ и 5 МБ текстовый файл. Я хочу убедиться, что больший файл включает в себя все строки, которые находятся в меньшем файле.

Вывод должен показать все строки меньшего файла, не включенного в больший файл. Я пытаюсь сравнить их с Notepad ++, но он зависает. Word 2007 сравнить трудно понять.

Я пробовал Beyond Compare, WinMerge, fc и многие другие. Строки не в одном и том же порядке в двух файлах - поэтому инструмент сравнения говорит, что строка отличается, но одна и та же строка находится в другом месте в большом файле. Думаю, маленький файл, как это -

abc def ghi jkl mno pqr yza bcd 

Подумайте большой файл, как это -

efg hij mno pqr ghi jkl abc def stu vwx 

Я хочу вывести это -

yza bcd 
2
По-видимому, это текстовые файлы, попробуйте использовать разные текстовые редакторы, например scite, и, возможно, онлайн-утилиту. Martín Canaval 11 лет назад 0
PowerShell, вероятно, может сделать это, но вам нужно будет немного погуглить. Sam Axe 11 лет назад 0
@ Дан-о: Да, я тоже так думаю !!! Я добавляю пакетный vbscript powershell к вопросу, но TFM удаляет его по некоторым причинам. Но я спрашиваю здесь после просмотра в Google, где я вижу только ответы Linux (которые я также говорю, но TFM удалить). Angelo 11 лет назад 0
это должно направить вас в правильном направлении: http://answers.oreilly.com/topic/1989-how-to-search-a-file-for-text-or-a-pattern-in-windows-powershell/ и http://blogs.technet.com/b/heyscriptingguy/archive/2011/10/09/use-a-powershell-cmdlet-to-count-files-words-and-lines.aspx Sam Axe 11 лет назад 0
Я удалил теги [powershell] и [vbscript], потому что вы не упомянули их в исходном вопросе, и вы должны попросить решение, а не предлагать то, что вы конкретно хотите попробовать. Ограничивая область применения определенными технологиями, вы также ограничиваете предложения. TFM 11 лет назад 0

2 ответа на вопрос

3
ubiquibacon

Достаточно использовать инструмент сравнения, например Beyond Compare, KDiff3 или Perforce .

ОБНОВИТЬ:

Я чувствовал себя щедрым этим утром, поэтому я бросил это вместе для вас. Должен делать то, что вы хотите.

enter image description here

Некоторые заметки:

1.) Этот код будет обрабатывать дубликаты. Например, если строка с одним и тем же текстом появляется дважды в маленьком файле, она должна появиться дважды в большом файле.

2.) Этот код игнорирует порядок строк в соответствии с вашим вариантом использования.

3.) Небольшая ошибка, связанная с пустыми строками в конце файла, с которыми я не хотел связываться. Этот код обрабатывает пустую строку как строку, как и любую другую строку, если она не находится в конце файла, и в этом случае допускается (и игнорируется) одна пустая строка. Например, если маленький файл имеет 3 пустых строки в конце файла и не имеет других пустых строк, то ожидается, что большой файл будет содержать не менее 2 пустых строк в середине других строк или 3 пустых строки в конец файла.

Бежать:

1.) Убедитесь, что у вас есть JDK установлен

2.) Убедитесь, что Java находится на вашем пути. Если вы работаете в системе Windows, перейдите в Панель управления> Система> Расширенные настройки системы> Переменные среды и выберите в Pathразделе Системные переменные. Добавьте местоположение вашей папки bin JDK в переменную path, убедившись, что она отделена от предыдущей записи точкой с запятой .. примерно так:

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

3.) Скопируйте приведенный ниже код в файл с именем FileLineComparator.java

4.) Откройте командную строку и перейдите в каталог с файлом, который вы только что создали

5.) Тип javac FileLineComparator.java

6.) Тип java -cp . FileLineComparator

7.) Наслаждайтесь!

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 } 
Я поддержу рекомендацию Beyond Compare, лучшего на мой взгляд, инструмента сравнения на рынке. wonea 11 лет назад 2
Да, Beyond Compare, хотя и не идеальный, безусловно, один из лучших. Daniel R Hicks 11 лет назад 0
Я не люблю Java и удаляю его после последнего предупреждения (все сайты, которые я использую, используют Flash, поэтому никаких проблем), но я попробую на ноутбуке друга с Java. Спасибо, и я приму, но было бы неплохо получить ответ от VBScript или PowerShell от кого-то. Angelo 11 лет назад 0
Недавние предупреждения о Java относятся только к Java 7. Просто придерживайтесь Java 6 пока. Также вам понадобится JDK для компиляции и запуска этого кода, а не просто стандартная установка JRE. ubiquibacon 11 лет назад 0
0
Chris Nava

WinMerge отлично подходит для сравнения текстовых файлов.