我正在开发一个小应用程序,它应该读取文件(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
开头。在这种情况下“查找和替换”然后创建新文件的正确方法是什么?
一如既往,感谢您的宝贵时间!
对
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
方法重新组合各个值,并将新字符串插入回行数组中。然后就会按照你的预期写出来。
在这里你创建了一个临时数组:
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);
}