сохранение данных в CSV-файл - PullRequest
0 голосов
/ 17 марта 2011

У меня проблема с сохранением данных в файле .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#   #"

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

"\ u0008" также не помогает.

Ответы [ 4 ]

1 голос
/ 18 марта 2011

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

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

    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();
0 голосов
/ 30 апреля 2015

Следующая функция используется для записи файла 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");
0 голосов
/ 28 ноября 2012

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

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

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

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

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

0 голосов
/ 18 марта 2011

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

...