Arquivos CSV (Comma Separated Values) são um formato onipresente para armazenamento de dados tabulares. Este artigo apresenta dois métodos C# eficientes para ler arquivos CSV e armazenar seus conteúdos em arrays. Exploraremos uma abordagem manual usando a classe StreamReader
e uma solução mais simplificada usando a classe TextFieldParser
da biblioteca Microsoft.VisualBasic.FileIO
.
Sumário
Lendo Arquivos CSV com StreamReader
A abordagem StreamReader
oferece controle granular sobre o processo de leitura, permitindo customização para diversos formatos CSV. No entanto, exige mais manipulação manual de delimitadores e condições de erro.
using System;
using System.IO;
public class CsvReaderStreamReader
{
public static string[][] ReadCsv(string filePath)
{
string[][] data = new string[0][]; // Inicializa como um array vazio
try
{
using (StreamReader reader = new StreamReader(filePath))
{
string line;
while ((line = reader.ReadLine()) != null)
{
string[] values = line.Split(',');
Array.Resize(ref data, data.Length + 1);
data[data.Length - 1] = values;
}
}
}
catch (Exception ex)
{
Console.WriteLine($"Erro ao ler o arquivo CSV: {ex.Message}");
}
return data;
}
public static void Main(string[] args)
{
string filePath = "data.csv";
string[][] csvData = ReadCsv(filePath);
if (csvData != null)
{
foreach (string[] row in csvData)
{
Console.WriteLine(string.Join(" ", row));
}
}
}
}
Este código aprimorado redimensiona dinamicamente o array, evitando a limitação de tamanho inicial arbitrário. Ele também usa interpolação de string para mensagens de erro mais limpas e string.Join
para saída concisa.
Lendo Arquivos CSV com TextFieldParser
O TextFieldParser
simplifica a análise de CSV, especialmente para arquivos complexos com campos entre aspas ou delimitadores personalizados. Ele lida com essas complexidades automaticamente.
using Microsoft.VisualBasic.FileIO;
using System;
public class CsvReaderTextFieldParser
{
public static string[][] ReadCsv(string filePath)
{
string[][] data = new string[0][];
try
{
using (TextFieldParser parser = new TextFieldParser(filePath))
{
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(",");
while (!parser.EndOfData)
{
string[] fields = parser.ReadFields();
Array.Resize(ref data, data.Length + 1);
data[data.Length - 1] = fields;
}
}
}
catch (Exception ex)
{
Console.WriteLine($"Erro ao ler o arquivo CSV: {ex.Message}");
}
return data;
}
public static void Main(string[] args)
{
string filePath = "data.csv";
string[][] csvData = ReadCsv(filePath);
if (csvData != null)
{
foreach (string[] row in csvData)
{
Console.WriteLine(string.Join(" ", row));
}
}
}
}
Este código lida eficientemente com a análise CSV usando TextFieldParser
. Lembre-se de adicionar uma referência ao assembly Microsoft.VisualBasic
em seu projeto.
Comparação de Métodos
Ambos os métodos alcançam o mesmo resultado, mas TextFieldParser
é geralmente preferido por sua robustez e facilidade de uso, particularmente com arquivos CSV complexos. StreamReader
oferece mais controle para cenários especializados, mas requer tratamento cuidadoso de erros e gerenciamento de delimitadores.