Lesen, Teilen und Anzeigen einer mehrzeiligen CSV-Datei in C #

Alles,

Ich versuche, ein Testprogramm zu schreiben, mit dem ich eventuell eine CSV-TXT-Datei erstellen und deren Inhalt in eine SQLite-Datenbankdatei kopieren kann. Es gibt Hunderte von Zeilen zu den TXT-Dateien, mit denen ich arbeite.

Folgendes habe ich bisher: Ein WPF-Formular mit drei Schaltflächen

Ausgang: selbsterklärend

CSV-Datei laden: Öffnet ein Win32-Dialogfeld zum Öffnen der Datei.

Current Directory Info: Findet das aktuelle Verzeichnis, in dem das Programm ausgeführt wird, und zeigt es an.

und einen Textblock, der verschiedene Informationen aus der Programmausgabe anzeigt - im Grunde genommen alles, was ich will, Dinge wie Ausnahmen usw.

Um die Textdatei zu lesen, implementiere ich den folgenden Code:

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

Es ist ein ziemlich einfaches Setup und die einzige Methode, mit der ich Probleme habe, ist inbtnLoad_Click. DasStreamReader Methode empfängt diefileName Variable aus dem Dialogfeld als Argument. Es öffnet erfolgreich die Datei. Während nicht am Ende des Dateistreams, wird eine Zeile mit gelesenvar line = sr.ReadLine();. Dann teilen wir die Zeile mit in ein Array aufvar lineWords = line.Split(',');. Anschließend wird die Länge des LineWords-Arrays mit in den Textblock gedrucktOutputConsole.Text = Convert.ToString(lienWords.Length);. Das Problem ist das Folgende: Es scheint, als würde nur ein Wert aus der Datei gelesen. Der Reader stoppt beim ersten Komma und hört dann auf zu lesen. Der Array-Wert, der gedruckt wird, ist 1, und nur ein Wert wird gedruckt, wenn ich ihn ändereOutputConsole.Text = Convert.ToString(lineWords.Length) zuOutputConsole.Text = Convert.ToString(lineWords[1]);. Außerdem ist es nicht der richtige Wert. Im Grunde habe ich nur ein Leerzeichen im Array und es ist nicht mit dem richtigen Wert gefüllt.

Was schlagen Sie vor, um dies zu ändern? Das Lesen von Dateien in C # war noch nie meine Stärke.

BEARBEITEN: Hier sind die ersten beiden Zeilen, als Beispiel für das, was in der Datei enthalten ist. Es ist Kinect-Ausgabe.

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

Das sind nur Überschriften.

Zweite Reihe: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

Ich glaube die Kodierung ist ANSI.

BEARBEITEN:

Hier ist der "neue" Block zum Lesen von Zeilen. Funktioniert bisher gut, jetzt müssen die Dinge in ein 2D-Array aufgeteilt werden.

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

}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage