C# - 读取、编辑和保存固定长度文件



>我需要读取FixedLenght文件,编辑其中的一些数据,然后将该文件保存到某个位置。这个应该完成所有这些操作的小应用程序应该每 2 小时运行一次。

这是文件的示例:

14000 US A111 78900

14000 US A222 78900

14000 US A222 78900

我需要查找 A111 和 A222 等数据,并将所有 A111 替换为例如 A555。我尝试过使用TextField解析器,但没有任何运气...这是我的代码。我能够获得数组元素,但我不确定下一步该怎么做......

using (TextFieldParser parser = 
FileSystem.OpenTextFieldParser(sourceFile))
{
parser.TextFieldType = FieldType.FixedWidth;
parser.FieldWidths = new int[] { 6, 3, 5, 5 };
while (!parser.EndOfData)
{
try
{
string[] fields = parser.ReadFields();
foreach (var f in fields)
{
Console.WriteLine(f);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}

这是Berkouz的解决方案,但仍然存在问题,数组的项在保存到文件时不会在输出中替换。代码:

string[] rows = File.ReadAllLines(sourceFile);
foreach (var row in rows)
{
string[] elements = row.Split(' ');
for (int i = 0; i < elements.Length; i++)
{
if (elements.GetValue(i).ToString() == "A111") {
elements.SetValue("A555", i);
}
}
}
var destFile = targetPath.FullName + "\" + "output.txt";
File.WriteAllLines(destFile, rows);

请注意 rows[rowIndex] 分配到的行。 这是因为字符串不变性迫使 replace 和类似函数具有输出值(而不是修改它们的输入(,您必须将其分配回数据存储(无论它是什么,在这种情况下是一个数组(。

var rows = File.ReadAllLines(sourcefile);
for (int rowIndex = 0; rowIndex != rows.Length; rowIndex++)
rows[rowIndex] = rows[rowIndex].Replace("A111", "A555");
File.WriteAllLines(destFile, rows);

这看起来像一个AB问题。如果这是一次性的事情,我建议你改用sed
调用很简单:sed -e 's/A111/A555/g'如果您的文件内容更复杂,您可以使用awkperlpcre正则表达式功能。

如果这实际上不是一次性的事情,并且您希望用 C# 编写它,您可以:A( 使用System.IO.File.ReadAllLines(),使用
string.Split()拆分文本,使用string.Replace()替换您想要的项目并使用
WriteAllLines()B( 将其写回MemoryMappedFile。这样,您就不必担心编写任何东西。但它往往会变得有点尖锐,你应该小心 BOM。

还有很多其他方法,这些是简单/慢/干净和快速/高效/丑陋代码的两端。

最新更新