gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:21:04 25 4
gpt4 key购买 nike

全部,

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

这是我目前所拥有的:一个带有三个按钮的 WPF 表单-

退出:不言自明

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

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

和一个文本 block ,显示程序输出中的各种信息 - 基本上,无论我想要什么,比如异常等等。

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

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

这是一个相当简单的设置,我遇到问题的唯一方法是在 btnLoad_Click 中。 StreamReader 方法从对话框中接收 fileName 变量作为参数。它成功打开了文件。虽然不在文件流的末尾,但使用 var line = sr.ReadLine(); 读取了一行。然后,我们使用 var lineWords = line.Split(','); 将该行拆分为一个数组。之后,使用 OutputConsole.Text = Convert.ToString(lienWords.Length); 将 lineWords 数组的长度打印到文本 block 。问题是这样的:似乎只从文件中读取了一个值,读取器停在第一个逗号处,然后停止读取。正在打印的数组值为 1,当我将 OutputConsole.Text = Convert.ToString(lineWords.Length) 更改为 OutputConsole.Text = Convert.ToString(lineWords[ 1]);。此外,它不是正确的值。所以基本上,我在数组中只有一个空间,并且没有填充正确的值。

你们有什么建议来改变这个?用 C# 读取文件从来都不是我的强项。

编辑:这是前两行,作为文件内容的样本。这是Kinect输出。

Time,HLState,HLX,HLY,HLZ,KLState,KLX,KLY,KLZ,ALState,ALX,ALY,ALZ,FLState,FLX,FLY,FLZ,HRState,HRX,HRY,HRZ,KRState, KRX,KRY,KRZ,ARState,ARX,ARY,ARZ,FRState,FRX,FRY,FRZ,lknfx,lknvg,rknfx,rknvg

那些只是标题。

第二行:700449555,2,-0.2912986,-0.1036692,1.472573,2,-0.2512482,-0.472762,1.416523,1,-0.2034467,-0.9132867,1.340637,1,-0.1271965,-0.9447169,1.280763,2,-0.197726, -0.09682589,1.596856,2,-0.1457276,-0.5412285,1.782268,2,-0.184881,-0.5280698,1.408923,2,-0.1630141,-0.537811,1.523656,178.867138094441,12.3859203137083,64.9231529324685,142.847159325228

我相信编码是 ANSI。


编辑:

这是用于读取行的"new" block 。到目前为止效果很好,现在,需要将事物拆分成一个二维数组。

try
{
using (StreamReader sr = new StreamReader(fileName))
{
lines = File.ReadAllLines(fileName);
}

int numberLines = lines.Length;
OutputConsole.Text = " ";
OutputConsole.Text += numberLines + " ";
for (int i = 0; i < numberLines; i++)
{
OutputConsole.Text += lines[i] + "\n";
}

}

最佳答案

我会这样做:

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

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

}
}

现在您有一个对象集合输出,每个对象都具有对您的值的强类型访问,这应该很容易填充到数据库中

关于c# - 在 C# 中读取、拆分和显示多行 CSV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16840810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com