큰 파일에 다른(더 작은) 파일이 포함되어 있는지 확인

큰 파일에 다른(더 작은) 파일이 포함되어 있는지 확인

3MB와 5MB의 텍스트 파일이 있습니다. 더 큰 파일에 더 작은 파일에 있는 모든 줄이 포함되어 있는지 확인하고 싶습니다.

출력에는 큰 파일에 포함되지 않은 작은 파일의 모든 줄이 표시되어야 합니다. 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

답변1

다음과 같은 비교 도구를 사용하여비할 바 없는,KDiff3, 또는억지로충분해야합니다.

업데이트:

오늘 아침에는 기분이 좋아서 당신을 위해 이것을 함께 던졌습니다. 당신이 원하는 것을 해야 합니다.

여기에 이미지 설명을 입력하세요

몇 가지 참고사항:

1.) 이 코드는 중복을 처리합니다. 예를 들어, 동일한 텍스트가 포함된 줄이 작은 파일에 두 번 나타나면 큰 파일에서도 두 번 나타날 것으로 예상됩니다.

2.) 이 코드는 사용 사례에 따라 줄 순서를 무시합니다.

3.) 파일 끝 부분의 빈 줄에 관한 작은 버그로 인해 엉망이 되고 싶지 않았습니다. 이 코드는 빈 줄이 파일 끝에 있지 않은 한 다른 줄과 마찬가지로 한 줄로 처리합니다. 이 경우 빈 줄 하나가 허용되고 무시됩니다. 예를 들어, 작은 파일의 끝에 3개의 빈 줄이 있고 다른 빈 줄이 없다면 큰 파일은 다른 줄 중간에 최소한 2개의 빈 줄이 있거나 파일 끝에 3개의 빈 줄이 있을 것으로 예상됩니다. 파일의 끝.

실행하려면:

1.) 당신이 가지고 있는지 확인하십시오JDK설치됨

2.) Java가 경로에 있는지 확인하십시오. Windows 시스템을 사용하는 경우 제어판 > 시스템 > 고급 시스템 설정 > 환경 변수로 이동하여 Path시스템 변수 섹션에서 선택합니다. JDK bin 폴더의 위치를 ​​경로 변수에 추가하고 세미콜론으로 이전 항목과 구분하십시오. 다음과 같습니다.

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
}

답변2

WinMerge텍스트 파일을 비교하는 데 좋습니다.

관련 정보