Последовательно упорядочить и добавить заполнители в текстовый файл - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть текстовый файл, который содержит данные.Есть 3 столбца, каждый столбец начинается в определенном месте и заканчивается конкретным местом в файле.Первый столбец (300, 301, 302, 304 ...) всегда основан на числах.второй столбец является строкой, а последний столбец является валютой.

В текущем файле .txt отсутствуют номера, которые являются (303, 305).Мне удалось найти пропущенные числа и добавить их в массив, а затем записать их в файл.

Моя цель - записать все данные столбцов последовательно в текстовый файл, даже пропущенные.Что касается столбцов 2 и 3, я хочу, чтобы 0 был заполнителем для отсутствующих данных и выровнен по собственному столбцу.

Я близко, но мне нужна помощь

   //read file
   string[] lines = File.ReadAllLines(FilePath);
   var Numbers = new List<int>();
   int i = 0;
   foreach (var line in lines)
   {
       //get value of first column
       var FirstColumn = line.Substring(0, 3);
       //add it to array
       Numbers.Add(Convert.ToInt32(FirstColumn));
       ++i;
   }
   //find missing numbers add to array
   var result = Enumerable.Range(Numbers.Min(), Numbers.Count);            

   //write to file
   using (StreamWriter file = new StreamWriter(OutPutFile, true))
   {
       foreach (var item in result.ToArray())
       {
           file.WriteLine(item);
       }                
   }


   Console.ReadKey();

Текущий файл .txt

300     Family Guy      1,123
301     Dexters Lab     456
302     Rugrats         1,789.52
304     Scooby-Doo      321
306     Recess          2,654
307     Popeye          1,987.02

ЦЕЛЬ: Требуемый выходной файл .txt

300     Family Guy      1,123
301     Dexters Lab     456
302     Rugrats         1,789.52
303     0               0
304     Scooby-Doo      321
305     0               0
306     Recess          2,654
307     Popeye          1,987.02

1 Ответ

0 голосов
/ 06 декабря 2018

Вы читаете первый столбец, но не остальные.Что я делаю, так это создаю словарь, используя первое число в качестве индекса и вставляя два других поля в System.ValueTuple (для этого нужно включить пакет Nuget ValueTyple).

СначалаЯ настраиваю некоторые вещи:

 const int column1Start = 0;
 const int column1Length = 3;
 const int column2Start = 8;
 const int column2Length = 15;
 const int column3Start = 24;

 int indexMin = int.MaxValue;     //calculated during the first
 int indexMax = int.MinValue;     //pass through the file

Затем я создаю свой словарь.Этот синтаксис (string, decimal) описывает 2-кортеж, который содержит строку и десятичное число (вроде как упорядоченные пары, о которых вас учили в старшей школе).

 Dictionary<int, (string, decimal)> data = new Dictionary<int, (string, decimal)>();

Затем я делаю проходстроки файла, считывание данных и вставка результатов в мой словарь (и вычисление максимальных и минимальных значений для этого первого столбца):

 var lines = File.ReadAllLines(fileName);
 foreach (var line in lines) {
     //no error checking
     var indexString = line.Substring(column1Start, column1Length);
     var cartoon = line.Substring(column2Start, column2Length).TrimEnd();
     var numberString = line.Substring(column3Start);

     if (int.TryParse(indexString, out var index)) {
         //I have to parse the first number - otherwise there's nothing to index on
         if (!decimal.TryParse(numberString, out var number)){
             number = 0.0M;
         }
         data.Add(index, (cartoon, number));

         if (index < indexMin) {
             indexMin = index;
         }
         if (index > indexMax) {
             indexMax = index;
         }
     }
 }

Наконец, со всеми моими данными в руках, я перебираюот минимального значения до максимального значения, извлекая два других столбца из моего словаря:

 for (int i = indexMin; i <= indexMax; ++i) {
     if (!data.TryGetValue(i, out var val)){
         val = ("0", 0.0M);
     }
     Console.WriteLine($"{i,5}  {val.Item1,-column2Length - 2}  {val.Item2, 10:N}");
 }

Мое форматирование не совсем такое, как у вас (я немного его очистил).Ты можешь делать, что хочешь.Мои результаты выглядят так:

  300  Family Guy           1,123.00
  301  Dexters Lab            456.00
  302  Rugrats              1,789.52
  303  0                        0.00
  304  Scooby-Doo             321.00
  305  0                        0.00
  306  Recess               2,654.00
  307  Popeye               1,987.02
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...