-2

我有一个大文本文件(20MB),我正在尝试将每第 4行和第 5行更改为0,0

在此处输入图像描述

我已经尝试过以下代码,但我很想知道是否有更好的方法来做这件事。

编辑:

        Power = new List<float>();
        Time = new List<float>();

        string line;
        float _i =0.0f;
        float _q =0.0f;
        int counter = 0;
        StreamReader file = new StreamReader(iqFile2Open);
        while ((line = file.ReadLine()) != null)
        {
            if (Regex.Matches(line, @"[a-zA-Z]").Count == 0)
            {
                string[] IQ = line.Split(',');
                if (IQ.Length == 2)
                {
                    _i = float.Parse(IQ[0]);
                    _q = float.Parse(IQ[1]);
                    double _p = 10 * (Math.Log10((_i * _i) + (_q * _q)));

                    if((counter%4)==0 || (counter%5)==0)
                        sw.WriteLine("0,0");
                    else
                    sw.WriteLine(string.Format("{0},{1}", _i, _q));

                    counter++;
                }
            }                
        }

提前致谢。!

4

2 回答 2

3

您可以读入所有行,根据其位置将每行映射到应有的位置,然后将它们全部写出来:

var lines = File.ReadLines(inputFile)
    .Select((line, i) => ComputeLine(line, i + 1));

File.WriteAllLines(outputFile, lines);

至于实际映射,您可以将行号修改 5 以获得“每 5 项”结果,然后将结果与您关心的两个 mod 值进行比较。请注意,由于您不希望删除第一项,因此索引是 1 索引而不是零索引很重要。

private static string ComputeLine(string line, int i)
{
    if (i % 5 == 4 || i % 5 == 0)
        return "0,0";
    else
        return line;
}

这流过文件中的每一行,而不是将整个文件加载到内存中。因此,输入和输出文件不同是很重要的。如果需要,您可以将输出文件复制到输入文件,或者您可以改为ReadAllLines将整个文件放入内存(假设文件保持适当的小),从而允许您写入读取的同一文件。

于 2013-09-17T15:31:47.080 回答
-3

您到底想替换什么?您是用特定的 LINE 还是特定的 TEXT 替换?

如果您正在寻找替换特定文本,您可以轻松地执行 string.Replace() 方法...

StreamReader fileIn = new StreamReader("somefile");
string fileText = fileIn.Readlines();
fileText = fileText.Replace("old", "new");
//Repeat last line for all old strings.
//write file...
于 2013-09-17T15:43:55.627 回答