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

您既不捕获也不使用的返回变量的调用String.Split不会更改基础字符串。所以你的代码等同于:

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

您需要获取并使用这些结果split1split2重新创建您的字符串。以下是我将如何重写您的代码:

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 回答
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 回答