#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)
andGetLength(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*/...}