【问题标题】:Replace header row from a Datatable with header row from another Datatable将数据表中的标题行替换为另一个数据表中的标题行
【发布时间】:2020-10-29 15:37:52
【问题描述】:

我有两个文本文件,一个标题和一个数据。 Titles 包含第二个标题行,即 Data。我使用以下方法将它们加载到 2 个单独的数据表中:

private static DataTable SwitchColumnHeadersInDatatable(string file)
        {
            char Delimiter = '#';
            string whole_file = System.IO.File.ReadAllText(file);
            whole_file = whole_file.Replace('\n', '\r').Replace("\"", "");
            string[] Lines = whole_file.Split(new char[] { '\r' },
                StringSplitOptions.RemoveEmptyEntries);

            List<string[]> FileRows = Lines.Select(line =>
                line.Split(new[] { Delimiter }, StringSplitOptions.None)).ToList();   //StringSplitOptions.RemoveEmptyEntries   --> To remove nulls

            DataTable dt = new DataTable();
            dt.Columns.AddRange(FileRows[0].Select(col => new DataColumn() { ColumnName = col }).ToArray());

            FileRows.RemoveAt(0);
            FileRows.ForEach(row => dt.Rows.Add(row));

            return dt;
        }

目标是将数据数据表标题行(列名)替换为标题数据表(包含列名)的第一行 我试过这样的想法:

DataTable dtTitle = LoadTextInDatatable(txtLastRepTitle);
        DataTable dtData = LoadTextInDatatable(txtLastRepData);

        dtTitle.AsEnumerable().Take(1).CopyToDataTable(dtData, LoadOption.OverwriteChanges);

但找不到指定要粘贴到数据表中的行索引(0)的方法。 (并且不要认为是最好的方法)。还需要指定标题上有一些需要删除的额外字段。 ("title1"#"Title2"#"Title3"#"type1"#"type2"#"type3" -> 只需要删除的Title和类型)

【问题讨论】:

  • 为什么要两张表?首先将标题读入表格。然后使用第二个文件归档并在索引 1(非零)处删除。
  • 感谢#jdweng 的建议。您能否就“带有第二个文件的文件”给出一个简短的提示\示例?恐怕我不明白
  • SwitchColumnHeadersInDatatableLoadTextInDataTable 是什么?你能重新写下“现在我想替换”这似乎是错误的,或者对我来说可能倒退吗?
  • 更改了方法名称(相同)并重新编写了 NetMage 部分。谢谢

标签: c# .net linq datatable


【解决方案1】:

将 LINQ 与 IEnumerable 一起使用,而不是在内存中处理所有内容。从一个文件中读取标题并从另一个文件中读取数据:

private static IEnumerable<string[]> ReadNonEmptyLinesUnquoteAndSplit(string file, char delimiter) =>
    File.ReadLines(file).Where(l => !String.IsNullOrEmpty(l)).Select(l => l.Replace("\"", "").Split(delimiter));

private static DataTable LoadDataTable(string titlePath, string dataPath) {
    char Delimiter = '#';
    var TitleRow = ReadNonEmptyLinesUnquoteAndSplit(titlePath, Delimiter).Skip(1).First();
    var DataRows = ReadNonEmptyLinesUnquoteAndSplit(dataPath, Delimiter).Skip(1);

    DataTable dt = new DataTable();
    dt.Columns.AddRange(TitleRow.Select(col => new DataColumn() { ColumnName = col }).ToArray());

    foreach (var dataRow in DataRows)
        dt.Rows.Add(dataRow);

    return dt;
}

【讨论】:

    猜你喜欢
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多