我有一个大文本文件(20MB),我正在尝试更改每个 4th & 5th 行到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++;
}
}
}
提前致谢。
答案 0 :(得分: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
将整个文件放入内存(假设文件保持适当的小),从而允许您写入您从中读取的同一文件
答案 1 :(得分:-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...