сохранение содержимого 2-мерного массива c # в файл csv

#c# #arrays #csv #multidimensional-array

#c# #массивы #csv #многомерный массив

Вопрос:

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

 StreamWriter file = new StreamWriter("C:/mylocation/data.csv");
//my2darray  is my 2d array created.
for (int i = 0; i < my2darray.GetLength(1); i  )
   {
            for (int j=0; j<my2darray.GetLength(0);j  )
            {
                file.Write(my2darray[i][j]);
                file.Write("t");
            }
            file.Write("n"); // go to next line
     }
  

Проблема в том, что каждая ячейка csv содержит более одного элемента массива. Как это можно исправить?

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

1. Принимает ли приложение, которое вы используете для просмотра файла, вкладки в качестве разделителей? Обычно в CSV-файле используются запятые. (В конце концов, это «значение, разделенное запятыми».) Кроме того, если вы используете Windows, вы, вероятно, захотите rn (окончание строки Windows), а не просто n . Чтобы правильно выполнять окончания строк независимо от платформы, вы можете использовать Environment.NewLine .

2. Поскольку вы используете j для итерации второго измерения массива, не должно ли это быть my2darray. getLength(1) в операторе for?

3. Кроме того, какой тип имеет my2darray? Это массив строк? Если это так, убедитесь, что вы заключаете строки в кавычки, если они могут содержать ваш разделитель, а затем убедитесь, что вы правильно экранируете все кавычки, которые они содержат.

4. Если вы используете Excel для просмотра результата, вы можете явно выбрать разделитель в мастере импорта.

5. Кроме того, является my2darray ли прямоугольный массив? Это то, что подразумевается при использовании GetLength(0) and GetLength(1) , но затем вы получаете доступ к его содержимому, как к неровному массиву ( my2darray[i][j] а не my2darray[i,j] ). Кроме того, я согласен с @Kevin в том, что, похоже, вы не придерживаетесь последовательности в порядке индексации вашего массива.

Ответ №1:

Я бы предпочел разделять представление и сохранение CSV:

 private static IEnumerable<String> ToCsv<T>(T[,] data, string separator = ",") {
  for (int i = 0; i < data.GetLength(0);   i)
    yield return string.Join(separator, Enumerable
      .Range(0, data.GetLength(1))
      .Select(j => data[i, j])); // simplest, we don't expect ',' and '"' in the items
}
  

 File.WriteAllLines(@"C:/mylocation/data.csv",
  ToCsv(my2array));  
  

Ответ №2:

Я бы написал цикл как что-то вроде этого:

   var my2darray = new[,]
  {
    { true, false, false, true },
    { true, false, false, true },
    { true, false, false, true },
    { true, false, false, true },
    { true, false, false, true },
  };

  var iLength = my2darray.GetLength(1);
  var jLength = my2darray.GetLength(0);

  for (int i = 0; i < iLength; i  )
  {
    for (int j = 0; j < jLength; j  )
    {
      file.Write("{0}t", my2darray[j, i]);
    }
    file.WriteLine();
  }
  

Имейте в виду, что при использовании my2darray.getLength(x) тогда ваш массив имеет тип arr[,], а не arr[][] .

Также обратите внимание, что если вы хотите, чтобы матрица была транспонирована в csv-файл, вам придется изменить i и y: my2darray[j, i]

Неровная версия может быть примерно такой (предполагая, что j-размерность i равна всему внешнему массиву (i-размерность):

   var my2darray = new[]
  {
    new [] { true, false, false, true },
    new [] { true, false, false, true },
    new [] { true, false, false, true },
    new [] { true, false, false, true },
    new [] { true, false, false, true },
  };

  var iLength = my2darray.Length;
  var jLength = my2darray[0].Length;

  for (int j = 0; j < jLength; j  )
  {
    for (int i = 0; i < iLength; i  )
    {
      Console.Write("{0}t", my2darray[i][j]);
    }
    Console.WriteLine();
  }
  

Ответ №3:

Это работает. Вероятно, вы используете неправильные разделители. Попробуйте » r n» для перевода строки и используйте разделитель csv, например «,»

Ответ №4:

У меня есть решение со следующей небольшой модификацией, как намекнул @adv12

 StreamWriter file = new StreamWriter("C:/mylocation/data.csv");
//my2darray  is my 2d array created.
for (int i = 0; i < my2darray.GetLength(1); i  )
  {
        for (int j=0; j<my2darray.GetLength(0);j  )
        {  
            file.Write(my2darray[i,j]);

            //it is comman and not a tab
            file.Write(",");  
        }
        //go to next line
        file.Write("n"); 

 }
  

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

1. Поскольку StreamWriter реализует IDisposable (и, следовательно, выделяет ресурсы ), оберните его в using : using (StreamWriter file = new StreamWriter("C:/mylocation/data.csv") {... /* your code here*/...}