Pergunta

http://csvhelper.com disponível via NuGet é usado para ler e gravar arquivos CSV.

CsvHelper permite que você leia seu arquivo CSV diretamente em sua classe personalizada.

Como a seguir foi mostrado em um anterior pergunta

var streamReader = // Create a reader to your CSV file.
var csvReader = new CsvReader( streamReader );
List<MyCustomType> myData = csvReader.GetRecords<MyCustomType>();

CsvReader irá figurar automaticamente Como corresponder aos nomes das propriedades com base na linha de cabeçalho (isto é configurável).Ele usa compilado árvores de expressão em vez de Então, é muito rápido.

Também é muito extensível e configurável.

Basicamente, estou tentando descobrir como ler um arquivo CSV com cabeçalhos (nomes desconhecidos) e ler os registros em um objeto personalizado.

Não há nenhuma documentação sobre isso, então me pergunto se alguém sabia como usar o CsvReader para colocar os valores em ordem em uma matriz de strings ou como você recomendaria lidar com isso?

Foi útil?

Solução

Esta é minha primeira versão, atualizarei à medida que alterar as coisas e torná-la mais completa, mas isso me dá todos os dados em matrizes de strings.

   [HttpPost]
        public ActionResult UploadFile(HttpPostedFileBase file)
        {

            ICsvParser csvParser = new CsvParser(new StreamReader(file.InputStream));
            CsvReader csvReader = new CsvReader(csvParser);
            string[] headers = {};
            List<string[]> rows = new List<string[]>();
            string[] row;
            while (csvReader.Read())
            {
                // Gets Headers if they exist
                if (csvReader.HasHeaderRecord && !headers.Any())
                {
                    headers = csvReader.FieldHeaders;
                }
                row = new string[headers.Count()];
                for (int j = 0; j < headers.Count(); j++)
                {
                    row[j] = csvReader.GetField(j);
                }
                rows.Add(row);
            }
            ImportViewModel model = new ImportViewModel(rows);
            return View(model);
        }

Outras dicas

Existe um CsvFieldAttribute que você pode colocar em sua propriedade onde você pode colocar o nome do campo csv ou o índice do campo csv.O nome só funcionará se houver uma linha de cabeçalho no arquivo csv.

public class MyCustomClass
{
    [CsvField( FieldIndex = 1 )]
    public string Property1 { get; set; }

    [CsvField( FieldIndex = 0 )]
    public string Property2 { get; set; }

    [CsvField( FieldIndex = 2 )]
    public string Property3 { get; set; }
}

Se tudo o que você deseja fazer é ler um registro em uma matriz de strings na ordem em que está no arquivo, basta usar CsvParser em vez de CsvReader.Chamando CsvParser.Read() retorna um string[]. CsvReader usa CsvParser para ler os dados brutos.

Eu sei que isso não está relacionado ao CVSHelpers, mas você pode considerar o Ajudantes de arquivos projeto

Ele permite decorar campos em um objeto com atributos para que ele represente uma linha no arquivo csv e então usar um FileHelperEngine para ler o arquivo - resultando em uma matriz de objetos, cada um representando uma linha

Veja isso começo rápido na leitura de arquivos delimitados

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top