Чтение, разбиение и отображение многострочного CSV-файла в C #
Все,
Я пытаюсь написать тестовую программу, которая в конечном итоге позволит мне взять CSV-файл .txt и поместить его содержимое в файл базы данных SQLite. Сотни строк в файлах .txt, с которыми я работаю.
Вот что у меня есть: форма WPF с тремя кнопками:
Выход: понятно
Загрузить файл CSV: появляется диалоговое окно Win32 Open File.
Информация о текущем каталоге: находит текущий каталог, из которого работает программа, и отображает его.
и текстовый блок, который отображает различную информацию из выходных данных программы - в основном, что бы я ни хотел, такие вещи, как исключения и т. д.
Чтобы прочитать текстовый файл, я реализую следующий код:
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 M,ainWindow : 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(',');
, После этого длина массива lineWords выводится в текстовый блок с помощьюOutputConsole.Text = Convert.ToString(lienWords.Length);
, Проблема в следующем: может показаться, что из файла читается только одно значение, читатель останавливается на первой запятой, а затем прекращает чтение. Значение печатаемого массива равно 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.
РЕДАКТИРОВАТЬ:
Вот «новый» блок для чтения строк. До сих пор работает хорошо, теперь нужно разделить вещи на 2D-массив.
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";
}
}