Простая сортировка по возрастанию очень проста, вызовите функцию sorted (). Он возвращает новый отсортированный список:
>>> sorted([66.25, 333, 333, 1, 1234.5])
[1, 66.25, 333, 333, 1234.5]
sorted () принимает обратный параметр с булевым значением.
>>> sorted([66.25, 333, 333, 1, 1234.5], reverse=True)
[1234.5, 333, 333, 66.25, 1]
Вы не совсем нуждаетесь в классе Flds для этой цели. Поскольку поле Done является последней строкой, вы можете проанализировать 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
Вот компактный способ сделать это:
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);
}
Это происходит потому, что String.Replace
принимает два строковых аргумента: oldValue и newValue. Вы указали newValue 'DT11.TotalAcc', однако пустая строка недопустима для oldValue.
Что вы можете сделать, это после получения DT11.Done, заменить его на некоторое значение 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);
}
Таким образом, вы будете не получить ошибку. Остальной код вы можете отформатировать соответственно
В настоящее время то, что вы делаете, содержит некоторые ошибки. В нижней строке вы получите ошибку.
text = text.Replace(DT11.Done, DT11.TotalAcc);
Поскольку в файле, который вы указали для столбца , значение «Готово» действительно отсутствует (пустое или пустое), поэтому оно вызывает исключение. Потому что метод Replace принимает первый аргумент и заменяет его значением, указанным в качестве второго аргумента. В случае, если оно пустое или пустое, возникнет исключение
. Поэтому вам нужно изменить код, как показано ниже. Пожалуйста, примите во внимание, что я написал код с использованием вашего класса под названием "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());
}