Czytanie, dzielenie i wyświetlanie wielowierszowego pliku CSV w C #
Wszystko,
Próbuję napisać program testujący, który w końcu pozwoli mi pobrać plik CSV .txt i umieścić jego zawartość w pliku bazy danych SQLite. Istnieją setki linii do plików .txt, z którymi pracuję.
Oto, co mam do tej pory: formularz WPF z trzema przyciskami -
Wyjście: nie wymaga wyjaśnień
Załaduj plik CSV: wyświetla okno dialogowe Win32 Open File.
Informacje o bieżącym katalogu: Znajduje bieżący katalog, z którego działa program i wyświetla go.
oraz blok tekstowy, który wyświetla różne informacje z wyjścia programu - w zasadzie, cokolwiek chcę, rzeczy takie jak wyjątki itp.
Aby odczytać plik tekstowy, implementuję następujący kod:
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);
}
}
}
}
Jest to dość prosta konfiguracja, a jedyną metodą, z którą mam problemy, jestbtnLoad_Click
. TheStreamReader
metoda otrzymujefileName
zmienna z okna dialogowego jako argument. Z powodzeniem otwiera plik. Nie będąc na końcu strumienia plików, czytana jest linia za pomocąvar line = sr.ReadLine();
. Następnie dzielimy linię na tablicę za pomocąvar lineWords = line.Split(',');
. Następnie długość tablicy lineWords jest drukowana do bloku tekstu za pomocąOutputConsole.Text = Convert.ToString(lienWords.Length);
. Problem polega na tym: wydaje się, że jeśli tylko jedna wartość jest odczytywana z pliku, czytnik zatrzymuje się na pierwszym przecinku, a następnie przestaje czytać. Drukowana wartość tablicy wynosi 1, a po zmianie drukowana jest tylko jedna wartośćOutputConsole.Text = Convert.ToString(lineWords.Length)
doOutputConsole.Text = Convert.ToString(lineWords[1]);
. Ponadto nie jest to poprawna wartość. Zasadniczo mam tylko jedną przestrzeń w tablicy i nie jest ona wypełniona odpowiednią wartością.
Co sugerujecie, żeby to zmienić? Odczyt plików w C # nigdy nie był moją mocną stroną.
EDYCJA: Oto pierwsze dwie linie, jako próbnik tego, co znajduje się w pliku. To wyjście 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
To tylko nagłówki.
Druga linia: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
Uważam, że kodowanie to ANSI.
EDYTOWAĆ:
Oto „nowy” blok do odczytu linii. Jak dotąd działa dobrze, teraz trzeba podzielić rzeczy na tablice 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";
}
}