usando csvhelper (nuGET) com C# MVC para importar arquivos CSV
-
14-11-2019 - |
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?
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