如何从文本文件中更新数据

时间:2019-01-17 07:10:12

标签: c#

我在文本文件中有一行具有以下结构:

<div class="row">
<div class="col-sm-3 bg-success" style="height:500px">d</div>
<div class="col-sm-6">
    <div class="row">
        <div class="col-sm-6 bg-primary" style="height:250px">d</div>
        <div class="col-sm-6 bg-info" style="height:500px">d</div>
    </div>        
    <div class="row">
        <div class="col-sm-6 bg-info" style="height:250px">z</div>
    </div>
</div>

我想将|Date |Name |TotalAcc|Folder|Done |20190105|LHN888|1 |5 | |20190105|RLM916|2 |5 | |20190105|TDE374|1 |5 | 字段更新为与"Done"字段相同的数量。

我试图阅读所有行和一些代码,但似乎错过了一些东西。

实际发生的是:

"TotalAcc"

引发此异常:

  

'字符串不能为零长度。参数名称:oldValue'

text = text.Replace(DT11.Done, DT11.TotalAcc);

我的预期结果如下:

if (File.Exists(@"C:\Users\" + strn))
{
    string ori_Files11 = @"C:\Users\var\log\test.txt";
    List<Flds> ListDT11 = new List<Flds>();
    using (StreamReader file11 = new StreamReader(ori_Files11))
    {
        string line;
        string text = "";
        while ((line = file11.ReadLine()) != null)
        {
            string[] SpltStr11 = line.Split('|');
            Flds DT11     = new Flds();
            DT11.Date     = SpltStr11[0];
            DT11.Name     = SpltStr11[1];
            DT11.TotalAcc = SpltStr11[2];
            DT11.Folder   = SpltStr11[3];
            DT11.Done     = SpltStr11[4];

            ListDT11.Add(DT11);
         }
    }
    for (int ii = 0; ii < ListDT11.Count(); ii++)
    {
         text = text.Replace(DT11.Done, DT11.TotalAcc);
         File.WriteAllText(ori_Files11, text);                            
    }

 }

4 个答案:

答案 0 :(得分:2)

之所以发生这种情况,是因为String.Replace带有两个字符串参数'oldValue'和'newValue'。您指定了newValue'DT11.TotalAcc',但是对于oldValue来说,空字符串是不合法的。

您可以做的是在获取DT11之后完成,将其替换为一些tempValue,然后使用它替换为新值

类似

while ((line = file11.ReadLine()) != null)
{
    string[] SpltStr11 = line.Split('|');
    Flds DT11     = new Flds();
    DT11.Date     = SpltStr11[0];
    DT11.Name     = SpltStr11[1];
    DT11.TotalAcc = SpltStr11[2];
    DT11.Folder   = SpltStr11[3];
    DT11.Done     = SpltStr11[4];

    if (string.IsNullOrEmpty(DT11.Done))
    {
         DT11.Done = "tempVal";
    }

    ListDT11.Add(DT11);
 }

这样,您将不会收到错误。您可以相应地格式化其余代码

答案 1 :(得分:0)

您并不需要为此提供Flds类。由于“完成”字段是最后一行,因此您可以在解析文件时解析totalAcc并将其附加到行尾。例如,

var data = File.ReadAllText(intputFileName);
var list = data.Split(new[]{Environment.NewLine},StringSplitOptions.RemoveEmptyEntries);
StringBuilder strBuilder = new StringBuilder($"{list.First()}{Environment.NewLine}");

foreach(var line in list.Skip(1))
{
        var totalAcc = line.Split(new[]{"|"},StringSplitOptions.RemoveEmptyEntries)[2];
        strBuilder.AppendLine($"{line}{totalAcc}");
}

File.WriteAllText(outputFileName,strBuilder.ToString());

输出

|Date    |Name  |TotalAcc|Folder|Done
|20190105|LHN888|1       |5     |1       
|20190105|RLM916|2       |5     |2       
|20190105|TDE374|1       |5     |1       

答案 2 :(得分:0)

当前您正在做的事情包含一些错误。在下面的行中,您会得到一个错误。

text = text.Replace(DT11.Done, DT11.TotalAcc);

因为在文件中您确实为列“完成” 提供了值(它为null或为空),所以它抛出Exception。 因为Replace方法采用第一个参数,并将其替换为第二个参数给出的值。如果为空或为null,则会引发异常

因此,您需要按以下方式更改代码。请考虑到我已经使用名为“ Flds” 的类编写了代码。我不知道您为什么实际使用它。在任何情况下都可以将其删除。在此过程中使用它没有任何意义

    private static void SyncAndUpdateFileContent(string fileToSync)
    {
        if (!File.Exists(@"C:\Users\" + fileToSync))
        {
            throw new FileNotFoundException($"File {fileToSync} does not exist!");
        }

        var ori_Files11 = @"C:\Users\var\log\test.txt";
        List<Flds> ListDT11 = new List<Flds>();
        string fileHeader = null;
        using (StreamReader file11 = new StreamReader(ori_Files11))
        {
            string line;
            while ((line = file11.ReadLine()) != null)
            {
                //Get file header copy
                if (string.IsNullOrEmpty(fileHeader))
                {
                    fileHeader = line;
                    continue;
                }

                string[] SpltStr11 = line.Split('|');
                Flds DT11 = new Flds
                {
                    Date = SpltStr11[0],
                    Name = SpltStr11[1],
                    TotalAcc = SpltStr11[2],
                    Folder = SpltStr11[3],
                    Done = SpltStr11[4]
                };

                ListDT11.Add(DT11);
            }
        }

        var stringBuilder = new StringBuilder($"{fileHeader}");
        foreach (var listDT11Item in ListDT11.Skip(1))
        {
            stringBuilder.AppendLine($"{listDT11Item.Date}|{listDT11Item.Name}|{listDT11Item.TotalAcc}|{listDT11Item.Folder}|{listDT11Item.TotalAcc}");
        }

        //Just call WriteAllText method at the end
        File.WriteAllText(ori_Files11, stringBuilder.ToString());
    }

答案 3 :(得分:0)

这是一种紧凑的方法:

static void Main(string[] args)
{
  // Read all lines from file
  var lines = File.ReadAllLines("Path");
  string[] linesToWrite = new string[lines.Length];
  for (int i = 0; i < lines.Length; i++)
  {
    var cells = lines[i].Split('|');
    // Appned value in "TotalAcc" column at the end of current line
    // and store it in array of lines, that will be written to file
    linesToWrite[i] = lines[i] + cells[2];
  }
  File.WriteAllLines("path", linesToWrite);
}