Сохранение элементов списка в файл CSV

#c#

#c#

Вопрос:

У меня есть поле списка, которое содержит информацию о студенте, в нем есть идентификатор студента и метка студента, когда я записываю в файл, я хочу, чтобы идентификатор студента и метка студента были в отдельных столбцах (например, первый идентификатор студента будет в A1, а их метка будет в B1. и так далее, пока все студенты не будут записаны в файл)

У меня есть этот код, но этот код добавляет информацию о студенте только в один столбец, как бы я мог разделить данные и поместить их в 2 столбца

 if(lstMarks.Items.Count > 0)
            {
                using(TextWriter outputfile = new StreamWriter("StudentRecords.csv"))
                {
                    foreach(string data in lstMarks.Items)
                    {
                        outputfile.WriteLine(data);
                    }
                    MessageBox.Show("Student Information inserted successfully"); 
                }
            }
  

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

1. Как выглядят данные?

2. @Simon это StudentID и пометка, пример B00123: 19. Я сохраняю StudentID в структуре списка, а пометку — в другой структуре списка и добавляю их в список, добавляя обе переменные и используя «:» между ними, чтобы разделить их, поэтому я бы хотел, чтобы : удалялось при добавлении в файл, если это возможно

3. данные в CSV должны быть разделены, например, ‘,’

4. @vik_78 Могу ли я добавить какой-нибудь код в приведенный мной пример кода для этого?

5. Попробуйте outputfile.WriteLine(string.Join(",", data.Split(':')));

Ответ №1:

Это сделает то, что вам нужно…

 outputfile.WriteLine(string.Join(",", data.Split(':')));
  

Что это делает, сначала он разбивает строку data , где он находит двоеточие, и это возвращает массив. string.Join() Затем объединяет этот массив обратно в строку, используя запятую в качестве разделителя.

В качестве альтернативы вы могли бы использовать data.Replace(":", ",") .

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

1. Спасибо за объяснение, поэтому, когда вы говорите, что он возвращает массив, вы имеете в виду, что когда он разделяет «данные», он превращает данные в массив, прежде чем объединить их обратно?

2. Да, именно это.

3. Я только что видел, как вы редактировали свой пост, если бы я использовал replace, это было бы просто так outputfile.WriteLine(data.Replace(":", ",")

4. Примечание стороны, это не очищает пробелы вокруг двоеточия, которые включены в данные вашего примера, поэтому на самом деле у вас будут выходные данные типа B00123 , 19 вместо B00123,19 .

5. ДА. Результат тот же. Для меня привычнее всего использовать метод split amp; join, поскольку замена строки в Javascript заменяет только первый экземпляр, поэтому вам придется использовать split amp; join (или регулярное выражение).

Ответ №2:

Вы можете создать строку и строку записи внутри вашего цикла foreach

Вам нужно будет разделить вашу строку, чтобы у вас были studentId и studentMark в массиве. Затем вы можете создать строку, разделенную запятой. Наконец, используйте flush для очистки всех буферов

 using(TextWriter outputfile = new StreamWriter("StudentRecords.csv"))
{
    foreach(string data in lstMarks.Items)
    {
        var dataArray = data.split(':');
        var line = string.Format("{0},{1}", data[0] , data[1]);
        outputfile.WriteLine(line);
        outputfile.Flush();
    }
    MessageBox.Show("Student Information inserted successfully"); 
}