0

大きな Web ログ ファイルがあります。ユーザーは異なる数字で表されます。各行は数字で始まります。

同じユーザーが 1 つのファイルに入るように、テキスト ファイルを分割する必要があります。

入力テキスト ファイルは次のようになります。

6993    xylazine    2006-03-01 19:09:30 3   
6993    xylazine    2006-03-01 19:09:30 9   
6993    irs 
6993    
6997    veterinarian horses 2006-03-05 10:39:16     
6997    socil security admin.   2006-03-06 18:57:30     
6997    social security administration  2006-03-06 18:58:35 
6997    bank of america branches    2006-03-07 20:08:03     
6997    phonebokk   2006-03-07 20:12:15     
6997    phone book  2006-03-07 20:12:19

FileReader と BufferedReader を使用して次のコードを作成しましたが、これらの API は必要な機能を提供していないようですが、多くのファイルが生成されます。ただし、このコードはすべての行を個別のファイルに分割します。しかし、同じユーザー(同じ番号(で始まる))で1つのファイルに分割したいです。以下のコードを修正して、私が望むことを達成する方法を誰かに教えてもらえますか?

package fileread;

import java.io.*;
import java.io.BufferedReader;
import java.io.PrintWriter;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class FileRead {
    public static void main( String[] args ) {
        File f = new File( "D:test.txt" );
        BufferedReader fileReader = null;
        FileOutputStream fout = null;
        BufferedWriter out = null;
        try {
            String text = " ", text1 = "content";
            int x = 2;
            fileReader = new BufferedReader( new InputStreamReader(
                    new FileInputStream( f ) ) );
            fout = new FileOutputStream( new File( "test1.txt" ) );
            OutputStreamWriter osr = new OutputStreamWriter( fout, "UTF-8" );// No
                                                                             // I18N
            PrintWriter pwr = new PrintWriter( osr, false );
            out = new BufferedWriter( new OutputStreamWriter( fout ) );
            while( (text = fileReader.readLine()) != null ) {
                text = text.trim();
                int inde = text.indexOf( " " );
                System.out.println( inde );
                if( inde > 0 ) {
                    String text2 = text1;
                    text1 = text.substring( 0, inde );
                    text1 = text1.trim();
                    text2 = text2.trim();
                    // System.out.println(text1);

                    if( text1.equals( text2 ) || text2.equals( "content" ) ) {
                        pwr.print( text );
                        pwr.print( "\n" );

                    } else {
                        osr.flush();
                        osr.close();
                        fout = new FileOutputStream( new File( "D:test" + x
                                + ".txt" ) );
                        osr = new OutputStreamWriter( fout, "UTF-8" );// No I18N
                        pwr = new PrintWriter( osr, false );
                        pwr.print( text );
                        pwr.print( "\n" );
                        x++;
                    }

                }
            }

            osr.flush();
            osr.close();

        } catch( Exception e ) {
            e.printStackTrace();

        } finally

        {
            try {
                if( fileReader != null ) {
                    fileReader.close();
                }
                if( fout != null ) {
                    fout.close();
                }
                if( out != null ) {
                    out.close();
                }
            } catch( Exception e ) {
            }
        }
    }

}

ただし、このコードはすべての行を個別のファイルに分割します。しかし、同じユーザー(同じ番号(で始まる))で1つのファイルに分割したいです。誰でもアイデアを与えることができますか?私はJavaが初めてです。いくつかの提案をしてください。前もって感謝します。

4

1 に答える 1

0

ユーザーの名前を確認してから、その行を正しいファイルに書き込む必要があります。ファイルのユーザー名とデータのすべてのペアのレコードをマップに入れます。次に、ユーザーの名前に従って、すべてのレコードを別のリストに入れ、最後にすべてのリストを別のファイルに書き込みます。次のようになります (疑似コード):

Map<String, String> userListPairs = new HashMap<String, List<String>>();

while(next line exists) {
  extract username
  if (!userListPairs.contains(username)) {
      userListPairs.put(username, new LinkedList<String>());
  }
  userListPairs.get(username).add(line);

}
for (Entry<String, List<String>> fileData : userListPairs.entrySet()) {
  //open file with name fileData.key()
  //write records from fileData.value() to the file.
}
于 2013-10-26T07:10:41.377 に答える