Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.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语言中读取、拆分和显示多行CSV文件#_C#_Csv - Fatal编程技术网

C# 在C语言中读取、拆分和显示多行CSV文件#

C# 在C语言中读取、拆分和显示多行CSV文件#,c#,csv,C#,Csv,全部, 我正试图编写一个测试平台程序,最终允许我获取一个CSV.txt文件,并将其内容放入SQLite数据库文件中。我正在处理的.txt文件有数百行 到目前为止,我得到的是:一个带有三个按钮的WPF表单- 退出:不言自明 加载CSV文件:弹出一个Win32打开文件对话框 当前目录信息:查找程序运行的当前目录,并显示它 还有一个文本块,它显示程序输出的各种信息——基本上,不管我想要什么,比如异常等等 为了读取文本文件,我实现了以下代码: using System; using System.Dat

全部,

我正试图编写一个测试平台程序,最终允许我获取一个CSV.txt文件,并将其内容放入SQLite数据库文件中。我正在处理的.txt文件有数百行

到目前为止,我得到的是:一个带有三个按钮的WPF表单-

退出:不言自明

加载CSV文件:弹出一个Win32打开文件对话框

当前目录信息:查找程序运行的当前目录,并显示它

还有一个文本块,它显示程序输出的各种信息——基本上,不管我想要什么,比如异常等等

为了读取文本文件,我实现了以下代码:

using System;
using System.Data;
using System.Data.SQLite;
using System.IO;
using System.Windows;
using System.Windows.Controls;

namespace C_Sharp_SQLite_Testbed
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {

        private static string fileName;
        public MainWindow()
        {
            InitializeComponent();
        }

        private void btnLoad_Click(object sender, RoutedEventArgs e)
        {
            Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
            dlg.FileName = "Document";
            dlg.DefaultExt = ".txt";
            dlg.Filter = "Text Documents (.txt)|*.txt";

            Nullable<bool> result = dlg.ShowDialog();

            if (result == true)
            {
                fileName = dlg.FileName;
                OutputConsole.Text = " ";
                OutputConsole.Text = fileName;

                try
                {
                    using (StreamReader sr = new StreamReader(fileName))
                    {
                        while (!sr.EndOfStream)
                        {
                            var line = sr.ReadLine();
                            var lineWords = line.Split(',');
                            OutputConsole.Text = Convert.ToString(lineWords.Length);

                        }
                    }
                }
                catch (Exception ex)
                {
                    OutputConsole.Text = " ";
                    OutputConsole.Text = ex.Message;
                }
            }
         }

        private void btnExit_Click(object sender, RoutedEventArgs e)
        {
            Environment.Exit(0);
        }

        private void btnInfo_Click(object sender, RoutedEventArgs e)
        {
            Environment.CurrentDirectory = Environment.GetEnvironmentVariable("windir");
            DirectoryInfo info = new DirectoryInfo(".");
            lock (info)
            {
                OutputConsole.Text = String.Format("Directory info:    " + info.FullName);
            }
        }
    }
}

您的文件读取代码有点奇怪(它有一些小的冗余),但我认为这不是问题所在。通常(遵循msdn示例)while循环是这样编写的

  string line;
  while ((line = sr.ReadLine()) != null) { ... }
此外,根据注释中的建议,您可以使用
string[]lines=File.ReadAllLines(文件名)然后用中间的分割逻辑循环行。我建议从代码中删除
EndOfStream
,并使用其他两种方法之一。我不知道它是否能解决你的问题,但这显然是不正常的


此外,您的输出是错误的,因为您没有附加到文本框,而是在设置它的值。这意味着您只能看到文件中最后一行的长度。如果要查看每行的长度,它需要是
OutputConsole.Text+=lineWords.length+“”如果您不知道这里有一个隐式强制转换,那么不需要显式强制转换,这只会降低代码的可读性。

我会这样做:

首先,定义一个类来保存文件的输出:

public class MyData
{
    public MyData() { }

    public MyData(string[] values)
    {
        Time = new DateTime(long.Parse(values[0]));
        HlState = int.Parse(values[1]);
        HLX = double.Parse(values[2]);
        HLY = double.Parse(values[3]);
        HLZ = double.Parse(values[4]);
    }

    public DateTime Time { get; set; }
    public int HLState { get; set; }
    public double HLX { get; set; }
    public double HLY { get; set; }
    public double HLZ { get; set; }
}
然后修改按钮事件以填充这些对象的列表

    private void btnLoad_Click(object sender, RoutedEventArgs e)
    {
        Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
        dlg.FileName = "Document";
        dlg.DefaultExt = ".txt";
        dlg.Filter = "Text Documents (.txt)|*.txt";

        if (dlg.ShowDialog() == true)
        {
            fileName = dlg.FileName;
            OutputConsole.Text = " ";
            OutputConsole.Text = fileName;

            var output = new List<MyData>();

            try
            {
                // First line skipped as we do not need headers.
                foreach (var line in File.ReadAllLines(filename).Skip(1))
                {
                    output.Add(new MyData(line.Split(",")));
                }

                OutputConsole.Text = string.Format("{0} lines read.", output.Lenght);
            }
            catch (System.IO.IOException ex)
            {
                //let user know there was an error reading file
            }

            // Do something with output

        }
    }
private void btnLoad\u单击(对象发送方,路由目标)
{
Microsoft.Win32.OpenFileDialog dlg=新的Microsoft.Win32.OpenFileDialog();
dlg.FileName=“文档”;
dlg.DefaultExt=“.txt”;
dlg.Filter=“文本文档(.txt)|*.txt”;
if(dlg.ShowDialog()==true)
{
fileName=dlg.fileName;
OutputConsole.Text=“”;
OutputConsole.Text=文件名;
var输出=新列表();
尝试
{
//跳过了第一行,因为我们不需要标题。
foreach(文件中的var行.ReadAllLines(文件名).Skip(1))
{
output.Add(新的MyData(line.Split(“,”));
}
OutputConsole.Text=string.Format(“{0}行已读。”,output.Lenght);
}
捕获(System.IO.IOException-ex)
{
//让用户知道读取文件时出错
}
//对输出做些什么
}
}

现在您有了一个对象的集合
输出
,每个对象都具有对您的值的强类型访问权限,可以轻松地填充到数据库中

为什么不只
string[]lines=File.ReadAllLines(fileName)
string text=File.ReadAllText(fileName)
请告诉我们您的文件(或其中的一部分)的内容并且避免使用
EndOfStream
Peek()
。只需检查
ReadLine()!=空
查看是的,抱歉,不清楚。
MyData
类应该为CSV的每一个“列”都有一个属性,并进行适当的命名和键入。也可以随意将“MyData”重命名为更适用于您所做工作的名称。我将尝试实现这一点。我已经更新了我的帖子,使
MyData
看起来更像您在CSV中发布的数据。注意到在
OutputConsole.Text=string.Format(“{0}行已读。”,output.Length)
行,
output
(我假设是我们的列表)没有成员方法
Length
。还有一件事。我试图用
for(inti=0;I
输出列表中的元素,但这只会生成一个“C_Sharp\u SQLite\u Testbed.MyData”列表。它不是访问列表,只是访问类的名称。
    private void btnLoad_Click(object sender, RoutedEventArgs e)
    {
        Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
        dlg.FileName = "Document";
        dlg.DefaultExt = ".txt";
        dlg.Filter = "Text Documents (.txt)|*.txt";

        if (dlg.ShowDialog() == true)
        {
            fileName = dlg.FileName;
            OutputConsole.Text = " ";
            OutputConsole.Text = fileName;

            var output = new List<MyData>();

            try
            {
                // First line skipped as we do not need headers.
                foreach (var line in File.ReadAllLines(filename).Skip(1))
                {
                    output.Add(new MyData(line.Split(",")));
                }

                OutputConsole.Text = string.Format("{0} lines read.", output.Lenght);
            }
            catch (System.IO.IOException ex)
            {
                //let user know there was an error reading file
            }

            // Do something with output

        }
    }