0

以下が私のファイルコンテンツであるとしましょう(何百もの同じパターン行)

    1979,2013-08-07 19:03:35,abc,12345,310012
    1980,2013-08-07 19:05:03,fds,12345,310160
.
.

ファイルを読み取り、ファイルを 1 行ずつスキャンし、行の 4 列目 (すべての行で繰り返される 12345) を別の値に置き換え、各行の最後に新しい値を追加したいと考えています。

最後に、更新された値を出力としてファイルを再生成する必要があります。

これが私がこれまでに行ったことです:

URL path = ClassLoader.getSystemResource("test.txt");

        File file = new File(path.toURI());

        try
        {

            Scanner scanner = new Scanner(file);

            while (scanner.hasNextLine())
            {
                String line = scanner.nextLine();

                // Here I need to do the replacement codes
            }
            scanner.close();
        }
        catch (FileNotFoundException e)
        {
            e.printStackTrace();
        }

各行を配列に分割してそのようなプロセスを実行するのは良い考えですか、それともこれに対するより良い解決策はありますか?

また、編集したコンテンツで出力を作成する方法もわかりません。どんな助けでも大歓迎です。

4

4 に答える 4

1

次のようなことを試すことができます:

public void replace(final int column, final String replacement, final File file, final String... appends) throws IOException {
    assert column >= 0 : "column < 0";
    final List<String> lines = new LinkedList<String>();
    final Scanner reader = new Scanner(file, "UTF-8");
    while(reader.hasNextLine()){
        final String line = reader.nextLine().trim();
        if(line.isEmpty())
            continue;
        final String[] tokens = line.split(",");
        assert column < tokens.length-1 : "column > tokens.length-1";
        tokens[column] = replacement;
        final StringBuilder builder = new StringBuilder();
        for(final String token : tokens)
            builder.append(token + ",");
        for(final String append : appends)
            builder.append(append + ",");
        builder.deleteCharAt(builder.length()-1);
        lines.add(builder.toString());
    }
    reader.close();
    final BufferedWriter writer = new BufferedWriter(new FileWriter(file, false));
    for(final String line : lines){
        writer.write(line);
        writer.newLine();
    }
    writer.flush();
    writer.close();
}

または、Java 8 を使用している場合は、次のようなことを試すことができます。

public void replace(final int column, final String replacement, final File file, final String... appends) throws IOException {
    assert column >= 0 : "column < 0";
    final List<String> lines = new LinkedList<>();
    final Scanner reader = new Scanner(file, "UTF-8");
    while(reader.hasNextLine()){
        final String line = reader.nextLine().trim();
        if(line.isEmpty())
            continue;
        final String[] tokens = line.split(",");
        assert column < tokens.length-1 : "column > tokens.length-1";
        tokens[column] = replacement;
        final List<String> temp = new LinkedList<>();
        temp.addAll(Arrays.asList(tokens));
        temp.addAll(Arrays.asList(appends));
        lines.add(temp.stream().collect(Collectors.joining(",")));
    }
    reader.close();
    final BufferedWriter writer = new BufferedWriter(new FileWriter(file, false));
    lines.forEach(
            l -> {
                try{
                    writer.write(l);
                    writer.newLine();
                }catch(IOException ex){
                    ex.printStackTrace();
                }
            }
    );
    writer.flush();
    writer.close();
}

このメソッドを呼び出すには、次のようにします。

replace(3, "string to replace 12345", file, strings_you_want_to_append_to_the_end); 
于 2013-08-28T03:43:21.930 に答える
1

これを行うには、各行を配列リストに入れsplit(",")、配列の各行で使用し、各配列の 4 番目のインデックスを置き換えます。配列を文字列に再結合するには、独自の関数を作成する必要があります (Java には組み込み関数がありません)。ただし、この問題に対処する別のスタック オーバーフローの質問があります。

try
    {
        Scanner scanner = new Scanner(file);

        // initialize the arraylist, which will hold the split strings
        ArrayList<String[]> data = new ArrayList<String[]>();

        while (scanner.hasNextLine())
        {
            // filling the arraylist
            String line = scanner.nextLine();
            String[] split = line.split(",");
            data.add(split);
        }
        scanner.close();

        // replacing the values
        for (String[] split : data) {
            split[3] = "new value";
        }

        // sloppily glueing everything back together
        String output = "";
        for (String[] split : data) {
            for (int i = 0; i < 5; i++) {
                if (i < 4) {output += datum + ",";}
                else {output += datum;}
            }
            output += "\n";
        }
        return output;
    }
catch (FileNotFoundException e)
    {
        e.printStackTrace();
    }

おそらく本当にずさんで非効率的ですが、かなり論理的です。

于 2013-08-28T03:23:21.997 に答える
0

正規表現でそれを行うことができます:

(?<=^[^,]+,[^,]+,[^,]+,)[^,]+

例えば:

private static final Pattern REGEX_PATTERN = 
        Pattern.compile("(?<=^[^,]+,[^,]+,[^,]+,)[^,]+");

public static void main(String[] args) {

    // Open input file

    // Open output file                

    // Read input line

    String inputLine = "1979,2013-08-07 19:03:35,abc,12345,310012";
    String outputLine = REGEX_PATTERN.matcher(input)
                                     .replaceFirst("YOUR_REPLACEMENT");

    // Print (only for debug)
    System.out.println(
        outputLine 
    );  // prints "1979,2013-08-07 19:03:35,abc,YOUR_REPLACEMENT,310012"

    // Write output line

    // Close both files

}
于 2013-08-28T03:43:11.960 に答える