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