parser - read csv file in c#




Leyendo el archivo CSV y almacenando valores en una matriz (12)

Acabo de encontrar esta biblioteca: https://github.com/JoshClose/CsvHelper

Muy intuitivo y fácil de usar. También tiene un paquete nuget que se implementa rápidamente: http://nuget.org/packages/CsvHelper/1.17.0 . También parece que se mantiene activamente lo que me gusta.

Configurarlo para usar un punto y coma es fácil: https://github.com/JoshClose/CsvHelper/wiki/Custom-Configurations

Estoy tratando de leer un archivo *.csv .

El archivo *.csv consta de dos columnas separadas por punto y coma (" ; ").

Puedo leer el archivo *.csv usando StreamReader y puedo separar cada línea usando la función Split() . Quiero almacenar cada columna en una matriz separada y luego mostrarla.

¿Es posible hacer eso?


Aquí está mi variación de la respuesta más votada:

var contents = File.ReadAllText(filename).Split('\n');
var csv = from line in contents
          select line.Split(',').ToArray();

La variable csv se puede usar como en el siguiente ejemplo:

int headerRows = 5;
foreach (var row in csv.Skip(headerRows)
    .TakeWhile(r => r.Length > 1 && r.Last().Trim().Length > 0))
{
    String zerothColumnValue = row[0]; // leftmost column
    var firstColumnValue = row[1];
}

Forma LINQ:

var lines = File.ReadAllLines("test.txt").Select(a => a.Split(';'));
var csv = from line in lines
          select (from piece in line
                  select piece);

^^ Incorrecto - Editado por Nick

Parece que el contestador original estaba intentando rellenar csv con una matriz bidimensional, una matriz que contiene matrices. Cada elemento de la primera matriz contiene una matriz que representa ese número de línea con cada elemento de la matriz anidada que contiene los datos para esa columna específica.

var csv = from line in lines
          select (line.Split(',')).ToArray();

He estado usando csvreader.com (componente de pago) durante años, y nunca he tenido un problema. Es sólido, pequeño y rápido, pero tienes que pagarlo. Puedes configurar el delimitador a lo que quieras.

using (CsvReader reader = new CsvReader(s) {
    reader.Settings.Delimiter = ';';
    reader.ReadHeaders();  // if headers on a line by themselves.  Makes reader.Headers[] available
    while (reader.ReadRecord())
        ... use reader.Values[col_i] ...
}

Mi analizador csv favorito es uno integrado en la biblioteca .net. Este es un tesoro escondido dentro del espacio de nombres Microsoft.VisualBasic. A continuación se muestra un código de ejemplo:

using Microsoft.VisualBasic.FileIO;

var path = @"C:\Person.csv"; // Habeeb, "Dubai Media City, Dubai"
using (TextFieldParser csvParser = new TextFieldParser(path))
{
 csvParser.CommentTokens = new string[] { "#" };
 csvParser.SetDelimiters(new string[] { "," });
 csvParser.HasFieldsEnclosedInQuotes = true;

 // Skip the row with the column names
 csvParser.ReadLine();

 while (!csvParser.EndOfData)
 {
  // Read current line fields, pointer moves to the next line.
  string[] fields = csvParser.ReadFields();
  string Name = fields[0];
  string Address = fields[1];
 }
}

Recuerde agregar referencia a Microsoft.VisualBasic

Más detalles sobre el analizador se dan aquí: http://codeskaters.blogspot.ae/2015/11/c-easiest-csv-parser-built-in-net.html


No puede crear una matriz inmediatamente porque necesita saber la cantidad de filas desde el principio (y esto requeriría leer el archivo csv dos veces)

Puede almacenar valores en dos List<T> y luego usarlos o convertirlos en una matriz utilizando List<T>.ToArray()

Ejemplo muy simple:

var column1 = new List<string>();
var column2 = new List<string>();
using (var rd = new StreamReader("filename.csv"))
{
    while (!rd.EndOfStream)
    {
        var splits = rd.ReadLine().Split(';');
        column1.Add(splits[0]);
        column2.Add(splits[1]);
    }
}
// print column1
Console.WriteLine("Column 1:");
foreach (var element in column1)
    Console.WriteLine(element);

// print column2
Console.WriteLine("Column 2:");
foreach (var element in column2)
    Console.WriteLine(element);

Puedes hacerlo así:

using System.IO;

static void Main(string[] args)
{
    using(var reader = new StreamReader(@"C:\test.csv"))
    {
        List<string> listA = new List<string>();
        List<string> listB = new List<string>();
        while (!reader.EndOfStream)
        {
            var line = reader.ReadLine();
            var values = line.Split(';');

            listA.Add(values[0]);
            listB.Add(values[1]);
        }
    }
}

Si necesita omitir (encabezados) líneas y / o columnas, puede usar esto para crear una matriz bidimensional:

    var lines = File.ReadAllLines(path).Select(a => a.Split(';'));
    var csv = (from line in lines               
               select (from col in line
               select col).Skip(1).ToArray() // skip the first column
              ).Skip(2).ToArray(); // skip 2 headlines

Esto es bastante útil si necesita dar forma a los datos antes de continuar procesándolos (asumiendo que las primeras 2 líneas consisten en el título, y la primera columna es un título de fila, que no necesita tener en la matriz porque simplemente Quiero tener en cuenta los datos).

NB Puede obtener fácilmente los titulares y la primera columna utilizando el siguiente código:

    var coltitle = (from line in lines 
                    select line.Skip(1).ToArray() // skip 1st column
                   ).Skip(1).Take(1).FirstOrDefault().ToArray(); // take the 2nd row
    var rowtitle = (from line in lines select line[0] // take 1st column
                   ).Skip(2).ToArray(); // skip 2 headlines

Este ejemplo de código asume la siguiente estructura de su archivo *.csv :

Nota: Si necesita omitir filas vacías, lo que a veces puede ser útil, puede hacerlo insertando

    where line.Any(a=>!string.IsNullOrWhiteSpace(a))

entre la declaración from y la select en los ejemplos de código LINQ anteriores.


Solo soy un estudiante que está trabajando en mi tesis de maestría, pero esta es la forma en que la resolví y funcionó bien para mí. Primero seleccione su archivo del directorio (solo en formato csv) y luego coloque los datos en las listas.

List<float> t = new List<float>();
List<float> SensorI = new List<float>();
List<float> SensorII = new List<float>();
List<float> SensorIII = new List<float>();
using (OpenFileDialog dialog = new OpenFileDialog())
{
    try
    {
        dialog.Filter = "csv files (*.csv)|*.csv";
        dialog.Multiselect = false;
        dialog.InitialDirectory = ".";
        dialog.Title = "Select file (only in csv format)";
        if (dialog.ShowDialog() == DialogResult.OK)
        {
            var fs = File.ReadAllLines(dialog.FileName).Select(a => a.Split(';'));
            int counter = 0;
            foreach (var line in fs)
            {
                counter++;
                if (counter > 2)    // Skip first two headder lines
                {
                    this.t.Add(float.Parse(line[0]));
                    this.SensorI.Add(float.Parse(line[1]));
                    this.SensorII.Add(float.Parse(line[2]));
                    this.SensorIII.Add(float.Parse(line[3]));
                }
            }
        }
    }
    catch (Exception exc)
    {
        MessageBox.Show(
            "Error while opening the file.\n" + exc.Message, 
            this.Text, 
            MessageBoxButtons.OK, 
            MessageBoxIcon.Error
        );
    }
}

Tengo una biblioteca que está haciendo exactamente lo que necesita.

Hace algún tiempo escribí una biblioteca simple y lo suficientemente rápida para trabajar con archivos CSV. Puede encontrarlo en el siguiente enlace: https://github.com/ukushu/DataExporter

Funciona con CSV como con 2 dimensiones array. Exactamente como usted necesita.

Como ejemplo, en caso de que necesite todos los valores de la tercera fila, solo necesita escribir:

Csv csv = new Csv();

csv.FileOpen("c:\\file1.csv");

var allValuesOf3rdRow = csv.Rows[2];

o para leer la segunda celda de

var value = csv.Rows[2][1];

Hola a todos, creé una clase estática para hacer esto. + verificación de columna + eliminación de signo de cuota

public static class CSV
{
    public static List<string[]> Import(string file, char csvDelimiter, bool ignoreHeadline, bool removeQuoteSign)
    {
        return ReadCSVFile(file, csvDelimiter, ignoreHeadline, removeQuoteSign);
    }

    private static List<string[]> ReadCSVFile(string filename, char csvDelimiter, bool ignoreHeadline, bool removeQuoteSign)
    {
        string[] result = new string[0];
        List<string[]> lst = new List<string[]>();

        string line;
        int currentLineNumner = 0;
        int columnCount = 0;

        // Read the file and display it line by line.  
        using (System.IO.StreamReader file = new System.IO.StreamReader(filename))
        {
            while ((line = file.ReadLine()) != null)
            {
                currentLineNumner++;
                string[] strAr = line.Split(csvDelimiter);
                // save column count of dirst line
                if (currentLineNumner == 1)
                {
                    columnCount = strAr.Count();
                }
                else
                {
                    //Check column count of every other lines
                    if (strAr.Count() != columnCount)
                    {
                        throw new Exception(string.Format("CSV Import Exception: Wrong column count in line {0}", currentLineNumner));
                    }
                }

                if (removeQuoteSign) strAr = RemoveQouteSign(strAr);

                if (ignoreHeadline)
                {
                    if(currentLineNumner !=1) lst.Add(strAr);
                }
                else
                {
                    lst.Add(strAr);
                }
            }

        }

        return lst;
    }
    private static string[] RemoveQouteSign(string[] ar)
    {
        for (int i = 0;i< ar.Count() ; i++)
        {
            if (ar[i].StartsWith("\"") || ar[i].StartsWith("'")) ar[i] = ar[i].Substring(1);
            if (ar[i].EndsWith("\"") || ar[i].EndsWith("'")) ar[i] = ar[i].Substring(0,ar[i].Length-1);

        }
        return ar;
    }

}

var firstColumn = new List<string>();
var lastColumn = new List<string>();

// your code for reading CSV file

foreach(var line in file)
{
    var array = line.Split(';');
    firstColumn.Add(array[0]);
    lastColumn.Add(array[1]);
}

var firstArray = firstColumn.ToArray();
var lastArray = lastColumn.ToArray();




csv