【问题标题】:Edit specific word in specific line编辑特定行中的特定单词
【发布时间】:2017-09-30 02:05:11
【问题描述】:

我知道这已被问过几次,但我需要一种快速的方法来处理不同大小的文件(小文件和大文件)。

我需要在 sat(txt) 文件中编辑比例因子。这是第三行的第一个数字:

700 104 1 0 16 Autodesk AutoCAD 19 ASM 221.0.0.1871 NT 24 星期二

2016 年 8 月 16 日 09:02:14

1000 9.9999999999999995e-007 1e-010

【问题讨论】:

标签: c# sat


【解决方案1】:

我建议提取一个方法和Linq:

private static String MyEditLine(string value) {
  var items = value.Split(new char[] { ' ' }, 2);

  items[0] = "2000"; // let's change 1000 into 2000

  return string.Join(" ", items);
}

...

var target = File
  .ReadLines(@"C:\MyFile.txt")
  .Select((line, index) => index != 2
     ? line
     : MyEditLine(line))
  .ToList(); 

File.WriteAllLines(@"C:\MyFile.txt", target);

【讨论】:

  • 但是,这个方法将整个目标文件读入内存,然后再写出来,是吗?
  • 如果你必须写入同一个文件(即更新现有文件),你必须实现(.ToList()并将整个文件读入内存);如果你写入不同的文件,你可以删除.ToList()
【解决方案2】:

假设您阅读了您的文件并获得了一个名为fileString[],并且您要修改的数字表示为float

您可以使用以下代码首先提取您想要的行。在此之后,您通过float.TryParse(..) 获得号码

int lineWithParam = 3;

String[] splittedLine = (file[lineWithParam-1]).Split(new char[] { ' ' }, 2);

if(splittedLine.Length == 2)
{
    float fact = 0.0f;

    String newFact = splittedLine[0];

    // or how ever you want to modify your factor
    if(float.TryParse(splittedLine[0], out fact))   
    {
        newFact = "" + (fact * 12.3f);

    }

    file[lineWithParam-1] = newFact + " " + splittedLine[1];
}

这里是一个可执行示例:https://dotnetfiddle.net/NVgETo

之后,您可以将String[] file 写回真实文件。

注意:这不会修改file,如果在给定行中的第一个参数不是有效的float

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    相关资源
    最近更新 更多