我在文本文件中有一行具有以下结构:
<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);
}
}
答案 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);
}