Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.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# 读取.txt文件的前10行,并将其打印在具有非固定列数C的DataTable中_C#_.net_Wpf - Fatal编程技术网

C# 读取.txt文件的前10行,并将其打印在具有非固定列数C的DataTable中

C# 读取.txt文件的前10行,并将其打印在具有非固定列数C的DataTable中,c#,.net,wpf,C#,.net,Wpf,我正在运行以下C代码以仅读取.txt文件的前10行: 使用MaterialDesignThemes.Wpf; 使用制度; 使用System.Collections.Generic; 使用System.Linq; 使用系统文本; 使用System.Threading.Tasks; 使用System.Windows; 使用System.Windows.Controls; 使用System.Windows.Data; 使用System.Windows.Documents; 使用System.Windo

我正在运行以下C代码以仅读取.txt文件的前10行:

使用MaterialDesignThemes.Wpf; 使用制度; 使用System.Collections.Generic; 使用System.Linq; 使用系统文本; 使用System.Threading.Tasks; 使用System.Windows; 使用System.Windows.Controls; 使用System.Windows.Data; 使用System.Windows.Documents; 使用System.Windows.Input; 使用System.Windows.Media; 使用System.Windows.Media.Imaging; 使用System.Windows.Navigation; 使用System.Windows.Shapes; 使用System.Data.SqlClient; 使用系统诊断; 使用系统数据; 命名空间测试环境 { /// ///MainWindow.xaml的交互逻辑 /// 公共部分类主窗口:窗口 { 公共主窗口 { 初始化组件; } 私有无效浏览按钮单击对象发送者,路由目标e { //创建OpenFileDialog Microsoft.Win32.OpenFileDialog openFileDlg=新建Microsoft.Win32.OpenFileDialog; //通过调用ShowDialog方法启动OpenFileDialog Nullable result=openFileDlg.ShowDialog; //获取所选文件名并显示在文本框中。 //在文本块中加载文件内容 如果结果==真 { FileNameTextBox.Text=openFileDlg.FileName; TextBlock1.Text=创建于:+System.IO.File.GetCreationTimeopenFileDlg.FileName.ToString; TextBlock1.Text+=Environment.NewLine+Environment.NewLine+string.Join\r\n,System.IO.File.ReadLinesopenFileDlg.FileName.Take10; //System.IO.File.ReadLinesopenFileDlg.FileName.Take10.ToString Debug.writelineText文件内容!; } //为文件扩展名和默认文件扩展名设置筛选器 openFileDlg.DefaultExt=.txt; openFileDlg.Filter=文本文件*.txt |*.txt |所有文件*.*.*; 已导入Debug.writelineText; //设置初始目录 openFileDlg.InitialDirectory=@C:\Documents\; //所有文件类型的多重选择 openFileDlg.Multiselect=true; 调试。写线程!; } 专用无效选项卡ABLZControl_选择更改对象发件人,选择更改对象发件人e { } } } 电流输出

但这正是我想要的。我实际上想要以表格格式打印内容,包括列名和行

为此,我搜索了一个类似的问题并找到了答案。然而,在那里发布的答案使用了固定数量的列。但是我想让这个方法采用动态的列数,因为我的txt文件没有相同的列长

我现在运行的代码是:

使用MaterialDesignThemes.Wpf; 使用制度; 使用System.Collections.Generic; 使用System.Linq; 使用系统文本; 使用System.Threading.Tasks; 使用System.Windows; 使用System.Windows.Controls; 使用System.Windows.Data; 使用System.Windows.Documents; 使用System.Windows.Input; 使用System.Windows.Media; 使用System.Windows.Media.Imaging; 使用System.Windows.Navigation; 使用System.Windows.Shapes; 使用System.Data.SqlClient; 使用系统诊断; 使用系统数据; 命名空间测试环境 { /// ///MainWindow.xaml的交互逻辑 /// 公共部分类主窗口:窗口 { 公共主窗口 { 初始化组件; } 公共DataTable ConvertToDataTablestring文件路径,int numberOfColumns { DataTable tbl=新的DataTable; 对于int col=0;col 提前感谢您的任何意见和帮助。高兴地提供更多的信息是不清楚的事情

可以找到我自己创建的伪.txt文件

[更新]根据评论

运行此操作后:贷记到:gkulshrestha

公共DataTable ConvertToDataTablestring文件路径 { DataTable tbl=新的DataTable; 字符串[]行=System.IO.File.ReadAllLinesfilePath; 变量lines1=lines.10; 对于int col=0;col [更新2:需要对行进行编码。将内容添加到UTF-8]

我正在尝试对行的内容进行编码。添加到UTF-8中。现在是ANSI。在网上搜索时,我在网上看到了一些文章

因此,我的DataGrid表方法如下所示:

公共DataTable ConvertToDataTablestring文件路径 { DataTable tbl=新的DataTable; //以前10行为例 var lines=File.ReadLinesfilePath.Take10; //拆分每行并创建一个整数序列,其中每个值 //是已拆分元素的数目 //然后获取此序列中存在的最大值 var max=lines.Selectx=>x.Split'\t'.Length.max; //第一行包含标题 string[]headers=lines.First.Split'\t'; //现在创建具有最大列数的表 对于int col=0;col 无法从“System.Data.DataRow”转换为“char[]”


错误消息告诉您,其中一行的列数超过了numberOfColumns变量中传递的值。因此,您构建了一个具有一定数量列的表,但随后发现一行包含更多数据

您只需在上更改退出条件的检查 for循环

for (int cIndex = 0; cIndex < cols.Length && cIndex < numberOfColumns; cIndex++)
然而,这将忽略额外的数据。您应该理解为什么一行有更多的数据,并决定是否要保留这些额外的数据

如果您事先不知道文件中的列数,那么您可以更改ConvertToDataTable并允许它发现最大列数。请始终记住,对于10行,性能没有问题,但是对于大文件,情况会发生变化

// No need to pass the number of columns, let the method discover it
public DataTable ConvertToDataTable(string filePath)
{
    DataTable tbl = new DataTable();

    // Take the first 10 lines
    var lines = File.ReadLines(filePath).Take(10);

    // Split each line and create an integer sequence where each value 
    // is the number of the splitted elements
    // then get the max value present in this sequence
    var max = lines.Select(x => x.Split('\t').Length).Max();

    // First line contains headers
    string[] headers = lines.First().Split('\t');

    // Now create the table with the max number of columns present
    for (int col = 0; col < max; col++)
        tbl.Columns.Add(new DataColumn(headers[col]));

    // You can simplify a lot your loop using the Rows.Add method that
    // accepts an object array     
    foreach (string line in lines.Skip(1))
    {
        tbl.Rows.Add(line.Split('\t'));
    }
    return tbl;
}

错误消息告诉您,其中一行的列数超过了numberOfColumns变量中传递的值。因此,您构建了一个具有一定数量列的表,但随后发现一行包含更多数据

您只需在for循环中更改退出条件的检查

for (int cIndex = 0; cIndex < cols.Length && cIndex < numberOfColumns; cIndex++)
然而,这将忽略额外的数据。您应该理解为什么一行有更多的数据,并决定是否要保留这些额外的数据

如果您事先不知道文件中的列数,那么您可以更改ConvertToDataTable并允许它发现最大列数。请始终记住,对于10行,性能没有问题,但是对于大文件,情况会发生变化

// No need to pass the number of columns, let the method discover it
public DataTable ConvertToDataTable(string filePath)
{
    DataTable tbl = new DataTable();

    // Take the first 10 lines
    var lines = File.ReadLines(filePath).Take(10);

    // Split each line and create an integer sequence where each value 
    // is the number of the splitted elements
    // then get the max value present in this sequence
    var max = lines.Select(x => x.Split('\t').Length).Max();

    // First line contains headers
    string[] headers = lines.First().Split('\t');

    // Now create the table with the max number of columns present
    for (int col = 0; col < max; col++)
        tbl.Columns.Add(new DataColumn(headers[col]));

    // You can simplify a lot your loop using the Rows.Add method that
    // accepts an object array     
    foreach (string line in lines.Skip(1))
    {
        tbl.Rows.Add(line.Split('\t'));
    }
    return tbl;
}

由于您事先不知道文本文件的列数,因此无法将numberOfColumns传递给ConvertToDataTable函数。 最好在读取文件后确定函数本身内的列数

试试这个:

    public DataTable ConvertToDataTable(string filePath)
    {
        DataTable tbl = new DataTable();
        string[] lines = System.IO.File.ReadAllLines(filePath);

        var lines1 = lines.Take(10);

        for (int col = 0; col < lines1.First().Split('\t').Length; col++)
            tbl.Columns.Add(new DataColumn("Column" + (col + 1).ToString()));

        foreach (string line in lines1)
        {
            var cols = line.Split('\t');

            DataRow dr = tbl.NewRow();
            for (int cIndex = 0; cIndex < cols.Length; cIndex++)
            {
                dr[cIndex] = cols[cIndex];
            }

            tbl.Rows.Add(dr);
        }

        return tbl;
    }

由于您事先不知道文本文件的列数,因此无法将numberOfColumns传递给ConvertToDataTable函数。 最好在读取文件后确定函数本身内的列数

试试这个:

    public DataTable ConvertToDataTable(string filePath)
    {
        DataTable tbl = new DataTable();
        string[] lines = System.IO.File.ReadAllLines(filePath);

        var lines1 = lines.Take(10);

        for (int col = 0; col < lines1.First().Split('\t').Length; col++)
            tbl.Columns.Add(new DataColumn("Column" + (col + 1).ToString()));

        foreach (string line in lines1)
        {
            var cols = line.Split('\t');

            DataRow dr = tbl.NewRow();
            for (int cIndex = 0; cIndex < cols.Length; cIndex++)
            {
                dr[cIndex] = cols[cIndex];
            }

            tbl.Rows.Add(dr);
        }

        return tbl;
    }

对于这种情况,您可以使用

    public DataTable ConvertToDataTable(string filePath)
    {
        DataTable tbl = new DataTable();
        string[] lines = System.IO.File.ReadAllLines(filePath);
        

        // just use lines.Take(10) if you want only 10 lines

        for (int col = 0; col < lines.First().Split('\t').Length; col++)
            tbl.Columns.Add(new DataColumn("Column" + (col + 1).ToString()));

        foreach (string line in lines)
        {
            var cols = line.Split('\t');

            DataRow dr = tbl.NewRow();
            for (int cIndex = 0; cIndex < cols.Length; cIndex++)
            {
                dr[cIndex] = cols[cIndex];
            }

            tbl.Rows.Add(dr);
        }

        return tbl;
    }

对于这种情况,您可以使用

    public DataTable ConvertToDataTable(string filePath)
    {
        DataTable tbl = new DataTable();
        string[] lines = System.IO.File.ReadAllLines(filePath);
        

        // just use lines.Take(10) if you want only 10 lines

        for (int col = 0; col < lines.First().Split('\t').Length; col++)
            tbl.Columns.Add(new DataColumn("Column" + (col + 1).ToString()));

        foreach (string line in lines)
        {
            var cols = line.Split('\t');

            DataRow dr = tbl.NewRow();
            for (int cIndex = 0; cIndex < cols.Length; cIndex++)
            {
                dr[cIndex] = cols[cIndex];
            }

            tbl.Rows.Add(dr);
        }

        return tbl;
    }


我可以看出你有两个大问题。首先,您只在datatable中创建一列。如果有多个列拆分为col,会发生什么情况?此外,您正在迭代到行。Length是一行中的字符数,而不是cols。Length是您将该行拆分为的cols数。@Andy是的,我知道您提到的两个问题。非常感谢。我是C语言的新手,我知道最终的结果是什么,但我很难用C代码复制它。DataTable不会自动将其内容显示为字符串。当将变量名添加到TabBOX1的输出中时,只得到类名IE:Stask.DATA DATABABLE,还考虑在RealLeLead和Read Lead之间,如果文件较大,则性能会有很大差异。您需要使用10,因此使用ReadLinesfilePath.Take10 Add.ToArrayYou有两个大问题,我可以看到。首先,您只在datatable中创建一列。如果有多个列拆分为col,会发生什么情况?此外,您正在迭代到行。Length是一行中的字符数,而不是cols。Length是您将该行拆分为的cols数。@Andy是的,我知道您提到的两个问题。非常感谢。我是C语言的新手,我知道最终的结果是什么,但我很难用C代码复制它。DataTable不会自动将其内容显示为字符串。当将变量名添加到TabBOX1的输出中时,只得到类名IE:Stask.DATA DATABABLE,还考虑在RealLeLead和Read Lead之间,如果文件较大,则性能会有很大差异。您需要使用10,因此请使用ReadLinesfilePath.Take10 Add.ToArray。感谢您的回复。你能检查一下我的更新吗?它与您的代码有关是的,正如@Steve提到的,您不能分配给textbox。您可以使用DataGrid从Datatable显示。嘿,谢谢您的回复。你能检查一下我的更新吗?它与您的代码有关是的,正如@Steve提到的,您不能分配给textbox。您可以使用DataGrid从Datatable显示。嘿,Steve,您可以编辑您的代码以包含第一行作为标题吗?因为现在我的标题类似于第1列、第2列等,但我希望我的第一行是标题,其余9行是内容,不需要测试它。然而,现在,最初的目的是摆脱不同长度的线已经失去。第一行用于创建列,因此下一行包含更多数据将使您返回初始例外Hey@Steve您可以检查我在插入行时将该行编码为UTF-8的更新。添加到数据网格。抱歉@NikSp,但我认为您应该发布一个新问题。这一个已经从原来的漂移了很多,它是没有用的网站有这样的哦。发布一个新问题将吸引新的回答者的注意,而不仅仅是我。在任何情况下,你都可以在这里发布新问题的链接,这样我会得到通知。好的,史蒂夫。谢谢你的留言。嘿,史蒂夫,你能编辑你的代码,把第一行作为标题吗?因为现在我的标题类似于第1列、第2列等,但我希望我的第一行是t
o是标题,其余9行是内容,无需测试即可完成。然而,现在,最初的目的是摆脱不同长度的线已经失去。第一行用于创建列,因此下一行包含更多数据将使您返回初始例外Hey@Steve您可以检查我在插入行时将该行编码为UTF-8的更新。添加到数据网格。抱歉@NikSp,但我认为您应该发布一个新问题。这一个已经从原来的漂移了很多,它是没有用的网站有这样的哦。发布一个新问题将吸引新的回答者的注意,而不仅仅是我。在任何情况下,你都可以在这里发布新问题的链接,这样我会得到通知。好的,史蒂夫。谢谢你的来信。