【问题标题】:Trying to write a 2D array to a .csv and not all the cells are copied over尝试将二维数组写入 .csv 并且并非所有单元格都被复制
【发布时间】:2018-05-18 18:46:30
【问题描述】:

我有几个数组/矩阵,我正在尝试使用 C# 将它们复制到 .csv,但我遇到了问题。我将向您展示的是一个 [12,480] 矩阵。我运行代码并完全复制所有前 11 行,但第 12 行中的最后 20 个值不会被复制到 .csv 中。我已经在控制台中显示了“myArray”,所有值都在那里,总矩阵长度为 5760。如果您知道发生了什么,请告诉我。我还有其他数组,它们填写了 480 个值中的 474 个、480 个值中的 427 个和 5760 个值中的 5712 个。

注意:代码正在运行,只是数组中的最后 20 个值不会复制到 .csv。我还附上了 .csv 的图像,让您更好地了解正在发生的事情。 The end of the matrix with the missing values highlighted in yellow

private static void CreateuCSV(double[,] myArray) 
{
    StreamWriter file = new StreamWriter("location")
    for (int i = 0; i <12; i++)
    {
        for (int j = 0; j < 480; j++)
        {
            file.Write(myArray[i,j];
            file.Write(",");
        }
        file.Write("\n");
    }
}

【问题讨论】:

  • 在我看来,矩阵中可能存在一些值,这会终止对 .csv 文件的写入?可能检查未写入 .csv 的矩阵的第一个实例中的列,并与其他矩阵进行比较,看看那里有什么样的格式和值。此外,如果您将 for 循环包装在 try catch 块中,您可以捕获一个异常并查看它的消息是什么。
  • 除了你的问题:即使你知道数组的大小,也不要硬编码它的维度。而是使用myArray.GetLength(0)myArray.GetLength(1)
  • Joe - 这是我最初拥有的,但它给了我同样的问题。我更改了硬编码尺寸,看看它是否发生了任何变化。
  • @SamuelOgletree 你有没有采纳我的建议?
  • 将此标记为无响应

标签: c# csv


【解决方案1】:

这会在 csv 中生成所需大小的方形数组...

 class Program
    {
        static void Main(string[] args)
        {
            int rows = 12, cols = 480;
            double[,] nums = new double[rows, cols];
            for (int i = 0; i < rows; i++)
            {
                for (int j = 0; j < cols; j++)
                {
                    nums[i, j] = j;
                }
            }

            CreateCSV(nums);
        }

        private static void CreateCSV(double[,] myArray)
        {
            var rows = myArray.GetLength(0);
            var cols = myArray.GetLength(1);

            using (StreamWriter file = new StreamWriter("2dArrayOut.csv"))
            {
                file.AutoFlush = true;
                for (int i = 0; i < rows; i++)
                {
                    for (int j = 0; j < cols; j++)
                    {
                        file.Write($"{myArray[i, j]},");
                    }
                    file.Write("\n");
                }
            }
        }
    }

【讨论】:

  • 这该死的和我的代码完全一样,减去行和列变量。我改变了我的以包括那些,它仍然给我同样的问题。
  • 使用 using(){...} 语句关闭/处理 Stream 怎么样?您还可以确保使用 file.AutoFlush = true; 刷新流
  • 除非数组是锯齿状的和/或实际上不是您声称的大小(您没有包含数组初始化代码),否则应该接受这个答案。
  • 另一个想法 - 你说你有几个不同的数组要输出到 csv:你是否以某种方式将输出调用与不同大小的数组交错?从您的原始代码中,我们已经可以看到您没有正确关闭/处理输出流。使用{}/Close()/Dispose() 在托管流实现中是可以互换的。微软说 - “您必须调用 Close 以确保所有数据都正确写入底层流......”所以,我认为只需在 using 块中限定 StreamWriter(调用 Dispose())就可以解决问题。
猜你喜欢
  • 2014-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-06
  • 1970-01-01
  • 2018-03-08
相关资源
最近更新 更多