Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用另一个数据表的标题行替换数据表的标题行_C#_.net_Linq_Datatable - Fatal编程技术网

C# 用另一个数据表的标题行替换数据表的标题行

C# 用另一个数据表的标题行替换数据表的标题行,c#,.net,linq,datatable,C#,.net,Linq,Datatable,我有两个文本文件,一个标题和一个数据。标题包含第二行的标题行,即数据。我使用以下方法将它们加载到两个单独的数据表中: private static DataTable SwitchColumnHeadersInDatatable(string file) { char Delimiter = '#'; string whole_file = System.IO.File.ReadAllText(file);

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

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;
        }

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

将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;
}
private static IEnumerable readNonemptylineUnquoteAndSplit(字符串文件,字符分隔符)=>
File.ReadLines(File).Where(l=>!String.IsNullOrEmpty(l)).Select(l=>l.Replace(“\”,”).Split(分隔符));
私有静态数据表LoadDataTable(字符串标题路径、字符串数据路径){
字符分隔符='#';
var TitleRow=readNonemptylineUnquoteAndSplit(titlePath,分隔符).Skip(1).First();
var DataRows=readNonemptylineUnquoteAndSplit(数据路径,分隔符)。跳过(1);
DataTable dt=新的DataTable();
AddRange(TitleRow.Select(col=>newdatacolumn(){ColumnName=col}).ToArray());
foreach(DataRows中的var dataRow)
dt.Rows.Add(数据行);
返回dt;
}

为什么有两个表?首先将标题读入表中。然后用第二个文件归档,并在索引1(不是零)处删除。感谢您的建议#jdweng。您能否给出一个关于“用第二个文件归档”的简短提示\示例" ? 恐怕我不明白什么是
SwitchColumnHeadersInDatatable
LoadTextInDataTable
?你能重新写“现在我想替换”吗?这对我来说似乎是错误的,或者可能是倒退的。更改了方法名称(是相同的),然后重新写NetMage的那个部分。谢谢
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;
}