CSVHelper 动态列数

CSVHelper Dynamic number of columns

我今天刚开始研究 csvhelper 库,并获得有关如何在下一栏中添加条目的新帮助。假设我有三个数据集,由(ABC Office、Sarah 的办公室和 Brian 的办公室)组成,这些是建筑物名称......对于每个建筑物,我都有 TaskName、PointName、DataName,然后是行的本地和值数据。 每个建筑物将有 2 列,可以有 10 或 20 个建筑物(动态) 每个建筑物可以是本地和值行下方的 1000 行数据。

我有以下代码

using (var writer = new StreamWriter(filePath))
                            using (var csv1 = new CsvWriter(writer))
                            {
    foreach (var point in this.Points)
                                    {
                                       csv1.WriteField(point.BuildingName);
                                       csv1.WriteField(" ");
                                        csv1.NextRecord();
                                        csv1.WriteField(point.TaskName);
                                        csv1.WriteField(" ");
                                        csv1.NextRecord();
                                        csv1.WriteField(point.PointName);
                                        csv1.WriteField(" ");
                                        csv1.NextRecord();
                                        csv1.WriteField(point.DataName);
                                        csv1.WriteField(" ");
                                        csv1.NextRecord();
                                    }
}

问题在于它将所有点信息放在第一列,然后将“ ”放在第二个字段中。

我最终需要的是这样的东西。

添加点信息后,希望能够在每个点下追加一个Local和Value列的数据集

是否可以使用 CSVHelper 在 CSV 中进行这种格式设置?

更新:

到目前为止,我已经走到这一步了。使用 String builder 添加了前 5 行数据。 现在我需要能够在每个 Office 下附加一个包含 Local 和 Value 列的数据集。 CSVHeper 库中是否有一种方法可以指定在何处附加数据集。前 5 行我是这样的。

var row1 = new StringBuilder();
 var row2 = new StringBuilder();
var row3 = new StringBuilder();
var row4 = new StringBuilder();


                                    foreach (var point in this.Points)
                                    {
                                        row1.Append($"{ point.BuildingName},,");
                                        row2.Append($"{point.TaskName},,");
                                        row3.Append($"{ point.PointName},,");
                                        row4.Append($"{ point.DataName},,");

                                    }
                                    //StreamWriter sw = new StreamWriter("filePath", true);
                                    using (StreamWriter sw = new StreamWriter(filePath1))
                                    {
                                        sw.Write(row1.ToString());
                                        sw.WriteLine();
                                        sw.Write(row2.ToString());
                                        sw.WriteLine();
                                        sw.Write(row3.ToString());
                                        sw.WriteLine();
                                        sw.Write(row4.ToString());
                                        sw.WriteLine();

                                        sw.Close();
                                    }

您尝试创建的不是 CsvHelper 为创建而创建的标准 CSV 文件。 CSV 文件包含一行 headers,后跟多行数据。您似乎正在使用逗号分隔值创建 Excel 报告。 CsvHelper 可以帮助您编写字段,但您必须提供编写报告格式的逻辑。以下是您可以执行此操作的一种方法。

public static void Main(string[] args)
{
    var points = new List<Point>
    {
        new Point
        {
            BuildingName = "ABC Office",
            TaskName = "Temperature",
            PointName = "14",
            DataName = "Temperature: Degrees F",
            Results = new List<Result> {
                new Result { Local = new DateTime(2019, 1,1), Value = 2},
                new Result { Local = new DateTime(2019, 1, 2), Value = 23}
            }
        },
        new Point
        {
            BuildingName = "Sarah's Office",
            TaskName = "Fan",
            PointName = "33",
            DataName = "0=Stop;1=Run",
            Results = new List<Result> {
                new Result { Local = new DateTime(2019, 1,1), Value = 2},
                new Result { Local = new DateTime(2019, 1, 2), Value = 23},
                new Result { Local = new DateTime(2019, 1, 3), Value = 45},
                new Result { Local = new DateTime(2019, 1, 4), Value = 34},
                new Result { Local = new DateTime(2019, 1, 5), Value = 36}
            }
        },
        new Point
        {
            BuildingName = "Brian's Office",
            TaskName = "Fan",
            PointName = "35",
            DataName = "Humidity",
            Results = new List<Result> {
                new Result { Local = new DateTime(2019, 1,1), Value = 2},
                new Result { Local = new DateTime(2019, 1, 2), Value = 23},
                new Result { Local = new DateTime(2019, 1, 3), Value = 45},
                new Result { Local = new DateTime(2019, 1, 4), Value = 34},
                new Result { Local = new DateTime(2019, 1, 5), Value = 36},
                new Result { Local = new DateTime(2019, 1, 6), Value = 56},
                new Result { Local = new DateTime(2019, 1, 7), Value = 92}
            }
        },
    };

    using (var writer = new StreamWriter(filePath))
    using (var csv = new CsvWriter(writer))
    {
        // Print buildings
        foreach (var point in points)
        {
            csv.WriteField(point.BuildingName);
            csv.WriteField("");
        }
        csv.NextRecord();

        // Print Tasks
        foreach (var point in points)
        {
            csv.WriteField(point.TaskName);
            csv.WriteField("");
        }
        csv.NextRecord();

        // Print Points
        foreach (var point in points)
        {
            csv.WriteField(point.PointName);
            csv.WriteField("");
        }
        csv.NextRecord();

        // Print DataNames
        foreach (var point in points)
        {
            csv.WriteField(point.DataName);
            csv.WriteField("");
        }
        csv.NextRecord();

        // Print value titles
        foreach (var point in points)
        {
            csv.WriteField("Local");
            csv.WriteField("Value");
        }
        csv.NextRecord();

        var endReached = false;
        var pointIndex = 0;

        // Print values
        while (!endReached)
        {
            endReached = true;
            foreach (var point in points)
            {
                if (point.Results.Count > pointIndex)
                {
                    csv.WriteField(point.Results[pointIndex].Local);
                    csv.WriteField(point.Results[pointIndex].Value);

                    if (point.Results.Count > pointIndex + 1)
                    {
                        endReached = false;
                    }
                }
                else
                {
                    csv.WriteField("");
                    csv.WriteField("");
                }
            }
            csv.NextRecord();

            pointIndex += 1;
        }
    }
}

public class Point
{
    public string BuildingName { get; set; }
    public string TaskName { get; set; }
    public string PointName { get; set; }
    public string DataName { get; set; }
    public List<Result> Results { get; set; }

}

public class Result
{
    public DateTime Local { get; set; }
    public int Value { get; set; }
}