2015-01-06 6 views
0

У меня есть автономное приложение C# с списком, отображающим данные, прочитанные моей программой. Я сохраняю его как файл excel, он отлично работает, но данные при сохранении сбрасываются в столбце, я попытался сохранить его как файл csv, но я не могу заставить его делать то, что я хочу, чтобы каждый отдельный элемент находился на отдельном столбец, пожалуйста, приветствуем любые приветствия Вот как мой вывод сконструирован, и я хочу, чтобы каждый из них находился в отдельном столбце, когда я открываю файл excel.Сохранение содержимого списка в виде файла CSV в C#

listView1.Items.Add(vis.brand+ "," + (vis.Count) + ","vis.model + "," + Math.Round(vis.sum)); 
+0

' " "vis.model' должен быть'"," + vis.model'. Что именно не работает? Обратите внимание, что если у вас есть кавычки в тексте, вам нужно избегать его с двойной кавычкой (Ed «The Hacker» Jones => Ed »« The Hacker »« Jones », и если у вас есть запятые или символы новой строки в строке, вы должны указать эта ячейка (Ed, Jr => «Ed, Jr»). –

+0

Хорошо, спасибо, Эрик, я сразу же дам вам снимок, я пытаюсь сохранить файл как csv, чтобы он мог распознавать запятую, и, таким образом, мои данные были в столбцах, а не просто сбрасывали все в одном столбце. – rigidboy

+0

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

ответ

0

Вы можете использовать пример this, выберите версию C#.

Он должен делать именно то, чего вы хотите достичь. Эта функция должна сделать трюк:

private void Button1_Click(object sender, EventArgs e) 
    { 
     //declare new SaveFileDialog + set it's initial properties 
      SaveFileDialog sfd = new SaveFileDialog { 
       Title = "Choose file to save to", 
       FileName = "example.csv", 
       Filter = "CSV (*.csv)|*.csv", 
       FilterIndex = 0, 
       InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) 
      }; 

      //show the dialog + display the results in a msgbox unless cancelled 

      if (sfd.ShowDialog() == DialogResult.OK) { 

       string[] headers = ListView1.Columns 
          .OfType<ColumnHeader>() 
          .Select(header => header.Text.Trim()) 
          .ToArray(); 

       string[][] items = ListView1.Items 
          .OfType<ListViewItem>() 
          .Select(lvi => lvi.SubItems 
           .OfType<ListViewItem.ListViewSubItem>() 
           .Select(si => si.Text).ToArray()).ToArray(); 

       string table = string.Join(",", headers) + Environment.NewLine; 
       foreach (string[] a in items) 
       { 
        //a = a_loopVariable; 
        table += string.Join(",", a) + Environment.NewLine; 
       } 
       table = table.TrimEnd('\r', '\n'); 
       System.IO.File.WriteAllText(sfd.FileName, table); 
      } 
    } 
+0

Привет, Маккроналд, поэтому ваш код C# Я думаю, я не понимаю, когда вы говорите, используйте версию C# :) – rigidboy

+0

Большое спасибо Sir/Dr/my Guru McRonald, что вы спасли меня, работали над этим с двух дней, я действительно ценю вашу своевременную поддержку, Бог благословит меня :)) – rigidboy

+0

Я ссылался на ссылку, которую я дал ya. Потому что на сайте microsoft вы можете загрузить версию VB.NET и C#. И да благословит вас Бог :) – McRonald

0

Ответ на вопрос @McRonald в основном покрывает его, но не удастся для важных случаев краев.

Если у вас есть запятая или кавычка в любой строке, это испортит выход. Например, если вы имели CSV с колоннами LastName и FirstName, кто-то с суффиксом, как «младший» будет скидывать запятые:

LastName, FirstName 
Smith, John 
Baker, Jr, Fred 

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

static public class CsvExtensions 
{ 
    static public string CsvQuote(this string text) 
    { 
     if (text == null) 
     { 
      return string.Empty; 
     } 

     bool containsQuote = false; 
     bool containsComma = false; 
     bool containsNewline = false; 
     bool containsCR = false; 
     int len = text.Length; 
     for (int i = 0; i < len && (containsComma == false || containsQuote == false); i++) 
     { 
      char ch = text[i]; 
      if (ch == '"') 
      { 
       containsQuote = true; 
      } 
      else if (ch == ',') 
      { 
       containsComma = true; 
      } 
      else if (ch == '\r') 
      { 
       containsCR = true; 
      } 
      else if (ch == '\n') 
      { 
       containsNewline = true; 
      } 
     } 

     bool mustQuote = containsComma || containsQuote || containsCR || containsNewline; 

     if (containsQuote) 
     { 
      text = text.Replace("\"", "\"\""); 
     } 

     if (mustQuote) 
     { 
      return "\"" + text + "\""; // Quote the cell and replace embedded quotes with double-quote 
     } 
     else 
     { 
      return text; 
     } 
    } 

} 

Вы бы разместить все, что код в своем собственном классе, а затем использовать его, как это (взяв строку кода из ответа @ McRonald's):

table += string.Join(",", a) + Environment.NewLine; 

становится

table += string.Join(",", a.CsvQuote()) + Environment.NewLine; 
Смежные вопросы