0

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

这是文件的示例:

14000 美国 A111 78900

14000 美国 A222 78900

14000 美国 A222 78900

我需要查找 A111 和 A222 之类的数据,并将所有 A111 替换为例如 A555。我试过使用 TextFieldParser 但没有任何运气......这是我的代码。我能够得到数组的元素,但我不知道下一步该怎么做......

    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);
4

2 回答 2

0

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

        var rows = File.ReadAllLines(sourcefile);
        for (int rowIndex = 0; rowIndex != rows.Length; rowIndex++)
            rows[rowIndex] = rows[rowIndex].Replace("A111", "A555");
        File.WriteAllLines(destFile, rows);
于 2019-09-11T13:03:59.287 回答
0

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

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

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

于 2019-09-11T08:27:59.007 回答