Как преобразовать текстовый файл в csv

#c# #csv

#c# #csv

Вопрос:

У меня есть входной файл с фиксированной длиной столбцов, и мне нужен файл, преобразованный в csv.

Текущий код преобразует его в csv, но столбцы смещены на основе различной длины пробелов.

Как мне убрать лишние запятые, чтобы количество столбцов было одинаковым?

C #, Visual Studio и CSV

 using System;
using System.IO;
using System.Linq;

namespace write_csv
{
    class Program
    {
        static void Main(string[] args)
        {

            string csvfilePath = @"C:Usersai_hackerDesktopoutput.csv";
            string[] lines = System.IO.File.ReadAllLines(@"C:Usersai_hackerDesktoporsc1827.ot2");

            foreach (string line in lines)
            {
                var parts = line.Split(' ');
                string csvLine = string.Join(',', parts);
                Console.WriteLine(csvLine);

                File.AppendAllText(csvfilePath, csvLine   Environment.NewLine);
            }


        }
    }
}
  

Ввод:

 439790                6806991   4700       NORTH AMERICAN 04/18/19  08161895  P90947L6 - O076GG7F
91921221              6835746   1385       GALLAGHER POWER04/18/19  09024922  P90948G0 - O076GHAR
  

текущий вывод:

 439790,,,,,,,,,,,,,,,,6806991,,,4700,,,,,,,NORTH,AMERICAN,04/18/19,,08161895,,P90947L6,-,O076GG7F
91921221,,,,,,,,,,,,,,6835746,,,1385,,,,,,,GALLAGHER,POWER04/18/19,,09024922,,P90948G0,-,O076GHAR
  

Нужно, чтобы столбцы выстраивались в линию:

 439790,6806991,4700,NORTH,AMERICAN,04/18/19,08161895,P90947L6,-,O076GG7F
91921221,6835746,1385,GALLAGHER,POWER04/18/19,09024922,P90948G0,-,O076GHAR
  

Комментарии:

1. Можете ли вы добавить образец ваших входных данных и что вы ожидаете на выходе?

2. Похоже, что в файле уже есть запятые, так что это csv. Это ввод или вывод? column1data, column2data и т. Д.

3. разделите значения с помощью некоторого разделителя («пробел» в вашем случае) из ot2 файла, а затем соедините запятыми

4. Не обновляйте вопрос ответами. По крайней мере, сделайте дополнительный раздел внизу.

5. «Оба предоставили вывод в консоль …» — нет, первый фрагмент вообще не записывается в консоль. Вы тестируете / ищете неправильный путь. Или запустить старую копию программы.

Ответ №1:

ввод разделен пробелом в текстовом формате, нужен csv

 foreach (string line in lines)
{
    var parts = line.Split(' ');
    string csvLine = string.Join(',', parts);
    Console.WriteLine(csvLine);
}
  

Это быстрое решение. Для «официального» csv вам нужно будет рассмотреть возможность размещения " текстовых полей и, следовательно, не различать текст и цифры.

Комментарии:

1. Я получаю сообщение об ошибке «Невозможно назначить «строку», потому что это «переменная итерации foreach»

2. @user9794893 — да, отредактировано. Вам нужна дополнительная строка.

3. Спасибо, вывод в консоли cmd не показывает запятые. Мне также нужно это для печати в файл CSV

4. «не показывает запятые» неясно и маловероятно. Проверьте строку записи, печатает ли она правильную строку?

5. Как мне проверить строку записи?

Ответ №2:

Эта работа может быть выполнена в одной строке без явного цикла с

 string csvfilePath = @"C:UsersDesktopooutput.csv";
string[] lines = System.IO.File.ReadAllLines(@"C:UsersDesktoporsc1827.ot2");
var result = string.Join(Environment.NewLine, 
                    lines.Select(x => x.Split(' '))
                         .Select(x => string.Join(",", x)));
File.WriteAllText(csvfilePath, result);
  

С примером ввода

 string input = @"
     1846223 6833581-1 75522 ADMC 04/17/19 09283609 P9093CC8 - O076FDE4
     1846201 6833581-1 75522 ADMC 04/17/19 09284581 P9093CC4 - O076FDE9";
  

Я получил этот вывод в строке результата

 1846223,6833581-1,75522,ADMC,04/17/19,09283609,P9093CC8,-,O076FDE4
1846201,6833581-1,75522,ADMC,04/17/19,09284581,P9093CC4,-,O076FDE9
  

И если вы хотите сохранить последние две подстроки вместе, вы можете добавить

 var result = string.Join(Environment.NewLine, 
              lines.Select(x => x.Replace(" - ", "-")
                  .Split(' ')).Select(x => string.Join(",", x)));
  

Если у вас было более одного пробела между данными, вы могли бы удалить лишние пробелы с помощью этого изменения

 var result = string.Join(Environment.NewLine,
          lines.Select(x => x.Replace(" - ", "-")
               .Split(new char[] { ' '}, StringSplitOptions.RemoveEmptyEntries))
               .Select(x => string.Join(",", x)));
  

Комментарии:

1. Спасибо, я все еще не вижу запятых в выходных данных

2. Я протестировал с помощью образца ввода, и я получаю запятую, как и ожидалось. Тогда что-то должно быть по-другому

3. Ошибка: строка [] не содержит определения для ‘Select’

4. Вам нужно добавить с помощью Linq; в верхней части вашего файла .cs

5. Он запустился, но файл csv не был создан

Ответ №3:

Попробуйте это, если вы не уверены в количестве пробелов между значениями в строке.

 RegexOptions options = RegexOptions.None;
Regex regex = new Regex("[ ]{2,}", options);     

string csvline;
foreach (string line in lines)
{
    csvline = regex.Replace(line, ",");
    Console.WriteLine(csvline);
}
  

Если вы уверены, что у вас есть только один, вы можете просто

 string csvline;
foreach (string csvline in lines){
        csvline = line.Replace(' ', ',');
        Console.WriteLine(csvline);
}
  

Комментарии:

1. Я получаю сообщение об ошибке «Невозможно назначить «строку», потому что это «переменная итерации foreach»

2. ах, извините. Вы не можете назначить переменным итерации. Изменил его на csvline

3. Я использовал первый и печатаю в консоли cmd, но я не вижу запятых

4. Как мне избавиться от лишних запятых между столбцами? Столбцы не выстраиваются в линию

Ответ №4:

Трудно точно сказать, о чем вы здесь просите, поэтому мой ответ будет довольно расплывчатым.

Для файла с разделителями вы будете разделять какие-то значения, поэтому мне придется сделать некоторые предположения о том, что это за значения. Строка.Функция объединения — это, вероятно, то, что вы там ищете. Он выдает строковый вывод, который является произведением массива объектов, соединенных указанным разделителем. (например, [1,2,3] => «1,2,3»)

Что касается записи вывода в файл, то необходимая вам функция аналогична той, которую вы использовали для чтения файла. Объект File имеет функцию WriteAllText, которая создаст текстовый файл, содержащий заданный текст (в виде строки), или файл.WriteAllLines будет иметь аналогичный результат, но с массивом строк.