Ler, dividir e exibir um arquivo CSV de várias linhas em c #
Todos,
Eu estou tentando escrever um programa de testbed que eventualmente permitirá que eu pegue um arquivo .txt CSV e coloque seu conteúdo em um arquivo de banco de dados SQLite. Existem centenas de linhas para os arquivos .txt com os quais estou trabalhando.
Aqui está o que eu tenho até agora: um formulário WPF com três botões
Saída: auto-explicativa
Carregar arquivo CSV: aparece uma caixa de diálogo Abrir Arquivo Win32.
Informações do diretório atual: localiza o diretório atual do qual o programa está operando e o exibe.
e um bloco de texto, que exibe várias informações da saída do programa - basicamente, o que eu quiser, coisas como exceções, etc.
Para ler o arquivo de texto, eu implemento o seguinte código:
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);
}
}
}
}
É uma configuração bastante simples, e o único método com o qual estou tendo problemas ébtnLoad_Click
. oStreamReader
método recebe ofileName
variável da caixa de diálogo como um argumento. Ele abre o arquivo com sucesso. Embora não no final do fluxo de arquivos, uma linha é lida usandovar line = sr.ReadLine();
. Em seguida, dividimos a linha em uma matriz usandovar lineWords = line.Split(',');
. Posteriormente, o comprimento da matriz lineWords é impresso no bloco de texto usandoOutputConsole.Text = Convert.ToString(lienWords.Length);
. O problema é este: parece que apenas um valor está sendo lido do arquivo, o leitor pára na primeira vírgula e, em seguida, deixa de ler. O valor da matriz que está sendo impressa é 1 e apenas um valor é impresso quando eu alteroOutputConsole.Text = Convert.ToString(lineWords.Length)
paraOutputConsole.Text = Convert.ToString(lineWords[1]);
. Além disso, não é o valor correto. Então, basicamente, eu só tenho um espaço na matriz e não é preenchido com o valor correto.
O que vocês sugerem para mudar isso? Leitura de arquivos em C # nunca foi meu forte.
EDIT: Aqui estão as duas primeiras linhas, como um sampler do que está no arquivo. É a saída do 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
Esses são apenas cabeçalhos.
Segunda linha: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
Eu acredito que a codificação é ANSI.
EDITAR:
Aqui está o bloco "novo" para a leitura de linhas. Funciona bem até agora, agora, há uma necessidade de dividir as coisas em um array 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";
}
}