【问题标题】:How to unfold a cell with CSV values into a column如何将具有 CSV 值的单元格展开到列中
【发布时间】:2020-02-03 19:27:59
【问题描述】:

全部,

您能否建议解决以下任务的最佳方法: 我有一个表格,其中一行的每个单元格都填充了逗号分隔值。给定行的相同数量的值。 对于每一行,我需要制作一个单独的表格(根据需要,单击一行或带有行标题的单独按钮),该表格由具有相同标题的相同数量的列组成,只有行中的每个单元格在一列中展开.

   AAA    BBB    CCC 
a  1,2,3  1,2,3  1,2,3
b  2,3,4  2,3,4  2,3,4

如果我点击一个写着“a”的地方,它会创建一个新表:

   AAA   BBB  CCC 
1. 1     1    1
2. 2     2    2
3. 3     3    3

等等。 我是否应该将一行读入一个数组,然后将数组中的每个值解析为另一个用逗号分隔的数组,然后从中构造一个二维数组,然后手动构造每一行并逐行添加......有吗更优雅的解决方案?

【问题讨论】:

  • 可以安全地假设每个原始列值在展开时将具有相同数量的值?
  • 我以为是,但是,刚刚发现我的数据库中的一些旧条目可能具有不同数量的值。无论如何,非常感谢,它让我知道了如何处理它。
  • 我为短列添加了一个测试。

标签: c# arrays csv datatables


【解决方案1】:

您可以使用这种扩展方法,测试不同的列大小:

public static class DataTableExt {
    public static DataTable UnfoldRow(this DataRow src) {
        var ans = src.Table.Clone();
        var work = src.Table.Columns.Cast<DataColumn>().Select(c => src.Field<string>(c.ColumnName).Split(',')).ToList();
        for (int j1 = 0; j1 < work[0].Length; ++j1)
            ans.Rows.Add(work.Select(w => j1 < w.Length ? w[j1] : "").ToArray());

        return ans;
    }
}

然后你根据需要提取DataRow,并传递它:

var unfoldedRow = dt.Rows[0].UnfoldRow();

【讨论】:

  • 我收到以下两个错误:错误 CS1106 扩展方法必须在非泛型静态类中定义错误 CS1061 'DataTable' 不包含 'ColumnNames' 的定义并且没有可访问的扩展方法可以找到接受“DataTable”类型的第一个参数的“ColumnNames”(您是否缺少 using 指令或程序集引用?)
  • 对不起,代码设置为使用明显的扩展名ColumnNames() - 我已将其修改为不需要扩展名。您可能应该阅读如何使用扩展方法 - 它们必须在 static class 中定义,因此是 public static class DataTableExt
猜你喜欢
  • 2015-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 2021-11-11
相关资源
最近更新 更多