【问题标题】:.NET get datatable rows using dynamic columns settings.NET 使用动态列设置获取数据表行
【发布时间】:2022-01-22 08:18:27
【问题描述】:

我有 2 个数据表,dt_columns 和 dt_rows; dt_columns 有一个动态列 dt_rows。如何使用dt_columns 中的IEnumerable<string> 检索/选择来自dt_rows 的数据、字段并将其导出到文本文件中?

dt_columns数据表:

header_name custom_header_name
column1 custom_header_1
column2 custom_header_2

dt_rows数据表:

id column1 column2
1 Value1.1 Value1.2
2 Value2.1 Value2.2

文本文件中的预期输出:

custom_header_1 custom_header_2
Value1.1 Value1.2
Value2.1 Value2.2

这是我前进方向的骨架:

StringBuilder sb = new StringBuilder();

DataTable dt_headers = new DataTable();
DataTable dt_rows = new DataTable();

using (var reader = ObjectReader.Create(data)) {
    dt_rows.Load(reader);
}

using (var reader = ObjectReader.Create(headers)) {
    dt_headers.Load(reader);
}

IEnumerable<string> column_names = dt_headers.Rows.Cast<DataRow>()
                                                .Select(row => (
                                                    row["custom_header_name"].ToString() == "" ? row["header_name"].ToString() : row["custom_header_name"].ToString()
                                                ));
sb.AppendLine(string.Join(delimeter, column_names));

foreach(DataRow row in dt_rows.Rows) {
     IEnumerable<string> fields = row.ItemArray.Select(field =>
     String.Concat("\"", field.ToString().Replace("\"", "\"\""), "\"")); 

     sb.AppendLine(string.Join(delimeter, fields));
}

using (StreamWriter output = new StreamWriter(Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "\\" + "resources\\", file_name + ".txt")))
{
   output.WriteLine(sb.ToString());
   output.Close();
}

【问题讨论】:

  • 您遇到了什么问题?
  • @zaggler 我想在dt_columns 中使用IEnumerable&lt;string&gt; 迭代dt_rows 数据并将数据附加到文本文件中。

标签: c# .net datatable stringbuilder


【解决方案1】:

我认为这样的事情应该可行:

string[] colNames = dt_headers.AsEnumerable().Select(r => r.Field<string>("header_name")).ToArray();
string[] custColNames = dt_headers.AsEnumerable().Select(r => r.Field<string>("custom_header_name")).ToArray();

// build row values separated by the delimiter as strings
IEnumerable<string> data = dt_rows.AsEnumerable()
    .Select(r => string.Join(delimiter, colNames.Select(c => r.Field<string>(c))));
// prepend header(custom column names):
data = data.Prepend(string.Join(delimiter, custColNames));

// write to text-file
File.WriteAllLines(
    Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "\\" + "resources\\", file_name + ".txt"),
    data);

【讨论】:

  • 我认为这可行,但custom_header_name 可能为空,因此列名应为header_name
  • @StoledInk:不客气
猜你喜欢
  • 2014-04-04
  • 1970-01-01
  • 1970-01-01
  • 2012-11-14
  • 2020-02-20
  • 1970-01-01
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
相关资源
最近更新 更多