сохранение данных в csv файле

У меня проблема с сохранением данных в файле .csv.

     void WriteLog(DataRow rzad)
    {
            StreamWriter sw = new StreamWriter("log.csv", true);
            int iColCount = 8;

            for (int i = 0; i < iColCount; i++)
            {
                if (!Convert.IsDBNull(rzad[i]))
                {
                    sw.Write(rzad[i].ToString());
                    sw.Write("\t");
                }
            }
            sw.Write("\n");
            sw.Flush();
            sw.Close();
    }

Проблема в том, что в файле у меня есть данные в столбце A. Я хочу разбить одну строку в формате DataRow на 8 частей, которые помещаются в 8 разных столбцов. Моя функция работает, так как не видит вкладку ("\t").

Я не могу размещать изображения, поэтому я пытаюсь описать результаты в файле csv:

2011-03-17 14:34:11asdPrzekroczono krytyczną minimalną wymaganą wartość parametru5010050080550

Это мой пример строки, и я хочу разбить ее на 8 столбцов:

2011-03-17 14:34:11     asd     Przekroczono krytyczną minimalną wymaganą wartość parametru   50     100    500     80      550     

"#\t#" не помогает. Результаты:

"2011-03-17 18:29:17#   #asd#   #Przekroczono krytyczną, maksymalną, wymaganą wartość parametru#    #560#   #100#   #500#   #80#    #550#   #"

Есть некоторая табуляция, но я хочу сказать, что был сделан не пробел, а переход к следующей ячейке :(

"" тоже не помогает.


person piwowarczyk85    schedule 17.03.2011    source источник
comment
Можете ли вы показать нам, что именно является выходом, пожалуйста?   -  person as-cii    schedule 17.03.2011
comment
И полный кусок исполняемого кода. Поскольку ваша функция кажется правильной.   -  person Hossein    schedule 17.03.2011
comment
Это может быть проблема с кодировкой. попробуйте sw.Write() и посмотрите, работает ли он. Если нет, попробуйте изменить sw.Write(\t) на sw.Write(#\t#) и посмотрите, записывает ли он #s?   -  person Hossein    schedule 17.03.2011
comment
Вы можете проверить это gist.github.com/riyadparvez/4467668.   -  person user    schedule 12.03.2013


Ответы (5)


Во-первых, вы говорите, что пишете в файл CSV (значения, разделенные запятыми). Но вы действительно пишете в файл с разделителями табуляции. И вам нужно написать /r/n между строками:

Это работает:

    StreamWriter sw = new StreamWriter(@"c:\log.csv", true); 
    int iColCount = 8; 
    for (int i = 0; i < iColCount; i++)
    {           
        {
            sw.Write(i.ToString()); 
            sw.Write("\t"); 
        } 
    } 
    sw.Write("\r\n"); 
    sw.Flush(); 
    sw.Close();
person Steve Wellens    schedule 17.03.2011

Я склонен согласиться @Hossein. Я думаю, что это проблема кодировки. Я запустил ваш код точно так же, как он есть на моей машине, и он работал отлично.

person John Kraft    schedule 17.03.2011
comment
К сожалению, я не могу вам помочь. Мне не приходится сталкиваться с проблемами кодирования там, где я работаю. Извиняюсь. - person John Kraft; 18.03.2011

На всякий случай, если вы до сих пор не нашли решение, так как написали этот вопрос год назад:

Вы можете использовать библиотеку KBCSV, которая очень популярна и обрабатывает почти все, что вам нужно. По умолчанию он использует csv, но его можно легко изменить для обработки tsv.

Для очень простого и легко ломаемого решения вы можете попробовать: string.Join("\t", rzad) + "\r\n"

Это не будет учитывать поля, содержащие вкладки. Если поле содержит вкладку, это сделает этот метод бесполезным. Обычно поля, содержащие разделитель, заключаются в двойные кавычки, а поля, содержащие двойные кавычки, заключаются в двойные кавычки.

Реализовать это не так уж сложно, но это было бы изобретением велосипеда, поскольку Кент Бугарт уже потратил много часов на рассмотрение нескольких крайних случаев, о которых я не знал.

person SamuelDavis    schedule 27.11.2012

Следующая функция используется для записи файла csv.

public static void WriteCSV(string file, string content)
{
   using (StreamWriter sw = new StreamWriter(file))
   {
      sw.Write(content);
   }
}

Затем вызовите эту функцию с помощью

string appendText = "";
for (int i = 0; i < iColCount; i++)
{
     if (!Convert.IsDBNull(rzad[i]))
     {
         appendText += appendText == "" ? rzad[i].toString() : "," + rzad[i].toString();
     }
}
WriteCSV("C:\\out\\out.csv",appendText);

Еще один простой пример для нескольких строк: каждая строка отделяется символом новой строки '\n'.

WriteCSV("C:\\out\\out.csv","a,b,c,d,e,f,g\nh,i,j,k,l,m,n\n");
person tony.0919    schedule 30.04.2015

person    schedule
comment
В чем вопрос? - person Matthias; 07.07.2021