0

私は、ファイル(ANSI 835)を​​読み取り、特定の位置のデータを一般的なデータに置き換える必要がある小さなアプリに取り組んでいます。基本的に、私はファイルから人の姓名をスクラブしようとしています。

私が検索している名前を含む行は次のようになります。

NM1*QC*1*Doe*John*R***MI*010088307    01~

私のコードは次のようになります。

string[] input_file = (string[])(e.Data.GetData(DataFormats.FileDrop));
string output_file = @"c:\scrubbed.txt";

foreach (string file in input_file)
{
    string[] lines = File.ReadAllLines(file);

    foreach (string line in lines)
    {
        if (line.StartsWith("NM1*QC"))
        {
            line.Split('*')[1] = "Lastname";
            line.Split('*')[2] = "Firstname";
        }
    }

    File.WriteAllLines(output_file, lines);
}

動作しますFile.WriteAllLinesが、データは変更されていません。私はNM1*QC次のように始まる行を取得しようとしています:

NM1*QC*1*Lastname*Firstname*R***MI*010088307    01~

ファイルには。で始まる行がたくさんありますNM1*QC。この状況で「検索して置換」してから新しいファイルを作成する適切な方法は何ですか?

いつものように、お時間をいただきありがとうございます!

4

2 に答える 2

3

ここでは、一時配列を作成しています。

line.Split('*')

そして、あなたはその内容を変更しています:

line.Split('*')[1] = "Lastname";

行が実行された後、この一時配列への参照は失われ、それに伴って変更が加えられます。

変更を永続化するには、次のアドレスに直接書き込む必要がありますlines

for (var i = 0; i < lines.Length; ++i)
{
    var line = lines[i];

    if (!line.StartsWith("NM1*QC"))
    {
        continue;
    }

    var parts = line.Split('*');
    parts[3] = "Lastname";
    parts[4] = "Firstname";

    lines[i] = string.Join("*", parts);
}
于 2013-02-11T16:18:26.283 に答える
3

String.Splitキャプチャも使用もしない変数を返すための呼び出しは、基になる文字列を変更しません。したがって、コードはこれに相当します。

 if (line.StartsWith("NM1*QC"))
 {
     string[] split1 = line.Split('*')[1] = "Lastname";
     string[] split2 = line.Split('*')[2] = "Firstname";
 }

split1との結果を取得し、それらを使用して文字列を再作成する必要がありsplit2ます。これが私があなたのコードを書き直す方法です:

string[] input_file = (string[])(e.Data.GetData(DataFormats.FileDrop));
string output_file = @"c:\scrubbed.txt";
foreach (string file in input_file)
{
    string[] lines = File.ReadAllLines(file);

    for (int i=0; i < lines.length; i++)
    {
        string line = lines[i];
        if (line.StartsWith("NM1*QC"))
        {
            string[] values = line.Split('*');
            values[1] = "Lastname";
            values[2] = "Firstname";
            lines[i] = String.Join("*", values);
        }
    }

    File.WriteAllLines(output_file, lines);
}

メソッドを使用して個々の値を再結合しString.Join、新しい文字列を行の配列に挿入し直していることに注意してください。その後、期待どおりに書き出されます。

于 2013-02-11T16:24:48.230 に答える