将数据表中的标题行替换为另一个数据表中的标题行

Posted

技术标签:

【中文标题】将数据表中的标题行替换为另一个数据表中的标题行【英文标题】: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 部分。谢谢 【参考方案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;

【讨论】:

以上是关于将数据表中的标题行替换为另一个数据表中的标题行的主要内容,如果未能解决你的问题,请参考以下文章

将分隔列拆分为另一个表中的单独行的高效查询

将一个数据帧中的匹配值替换为另一个数据帧中的索引值

将数据框特定列中的 Nan 值替换为另一个数据框特定列中的值

使用部分字符串匹配将数据框中的列替换为另一个数据框列

如果它们之间的欧几里得是最低的,则将一个数据帧中的 2D 点替换为另一个数据帧中的 2D 点

用脚本中的 sed 将行替换为文件的内容