Eu tenho uma lista de valores inteiros (Lista) e gostaria de gerar uma seqüência de valores delimitados por vírgula. Todos os itens da lista são gerados em uma única lista delimitada por vírgula.
Meus pensamentos ... 1. passar a lista para um método. 2. Use stringbuilder para iterar a lista e acrescentar vírgulas. 3. Teste o último caractere e, se for vírgula, exclua-o.
Quais são seus pensamentos? É este o melhor caminho?
Como meu código mudaria se eu quisesse lidar não apenas com números inteiros (meu plano atual), mas com strings, longs, doubles, bools, etc etc. no futuro? Eu acho que fazê-lo aceitar uma lista de qualquer tipo.
List<int>
não possui métodoSelect
na estrutura 3.5, a menos que esteja faltando alguma coisa.using
declaração.System.Linq.Enumerable
(e é claro que você precisará deSystem.Core.dll
montagem, mas presumivelmente você já a possui). Você vê,List<int>
nunca temSelect
como método. Em vez disso,System.Linq.Enumerable
defineSelect
como um método de extensão emIEnumerable<T>
, do qualList<int>
é um exemplo de. Assim, você precisaSystem.Linq.Enumerable
em suas importações escolher esse método de extensão.x.ToString(CultureInfo.InvariantCulture)
. Isso usará o período como separador decimal.no 3.5, eu ainda era capaz de fazer isso. É muito mais simples e não precisa de lambda.
fonte
ToArray()
O método deList<int>
não pode ser usado com o argumento type no framework 3.5, a menos que esteja faltando alguma coisa.Você pode criar um método de extensão que você pode chamar em qualquer IEnumerable:
Então você pode simplesmente chamar o método na lista original:
fonte
Você pode usar
String.Join
.fonte
ConvertAll
aqui - ambosint
estring
serão inferidos.Array.ConvertAll(...' you can just do
list.ConvertAll (e => e.ToString ()). ToArray) `, apenas menos digitação.Se alguém desejar converter a lista de objetos de classe personalizados em vez da lista de cadeias , substitua o método ToString da sua classe pela representação de linha csv da sua classe.
Em seguida, o código a seguir pode ser usado para converter essa lista de classes em CSV com a coluna do cabeçalho
fonte
Como o código no link fornecido pelo @Frank Crie um arquivo CSV a partir de uma lista genérica do .NET, houve um pequeno problema ao terminar cada linha com um
,
modifiquei o código para se livrar dele. Espero que ajude alguém.fonte
dev
existe, mas não o arquivo ... não estou usando isso certo?sw.Write(string.Join(",", props.Select(d => d.Name).ToArray()) + newLine);
não testado, mas não sei o que você está tentando alcançarEu explico isso em profundidade neste post . Vou colar o código aqui com breves descrições.
Aqui está o método que cria a linha do cabeçalho. Ele usa os nomes de propriedades como nomes de colunas.
Este método cria todas as linhas de valor
E aqui está o método que os reúne e cria o arquivo real.
fonte
|
gero arquivos delimitados usando a versão aprimorada. Obrigado!Qualquer solução funcionará apenas se Listar uma lista (de sequência)
Se você possui uma lista genérica de seus próprios Objetos, como lista (de carro), em que carro possui n propriedades, você deve fazer um loop na PropertiesInfo de cada objeto de carro.
Veja: http://www.csharptocsharp.com/generate-csv-from-generic-list
fonte
Eu gosto de um bom método de extensão simples
Então você pode simplesmente chamar o método na lista original:
Mais limpo e fácil de ler do que algumas das outras sugestões.
fonte
O problema com String.Join é que você não está manipulando o caso de uma vírgula já existente no valor. Quando existe uma vírgula, você coloca o valor entre aspas e substitui todas as cotações existentes por aspas duplas.
Consulte Módulo CSV
fonte
A biblioteca CsvHelper é muito popular no Nuget. Você vale a pena, cara! https://github.com/JoshClose/CsvHelper/wiki/Basics
Usar o CsvHelper é realmente fácil. Suas configurações padrão são definidas para os cenários mais comuns.
Aqui estão alguns dados de configuração.
Actors.csv:
Actor.cs (objeto de classe personalizado que representa um ator):
Lendo o arquivo CSV usando CsvReader:
var atoresList = csv.GetRecords ();
Gravando em um arquivo CSV.
fonte
Por qualquer motivo, @AliUmair reverteu a edição para sua resposta que corrige seu código que não é executado como está, então aqui está a versão de trabalho que não possui o erro de acesso ao arquivo e lida adequadamente com valores de propriedades de objetos nulos:
fonte
http://cc.davelozinski.com/c-sharp/the-fastest-way-to-read-and-process-text-files
Este site fez alguns testes extensivos sobre como gravar em um arquivo usando gravador em buffer, ler linha por linha parece ser a melhor maneira, usar o construtor de strings foi um dos mais lentos.
Eu uso muito as técnicas dele para escrever coisas para arquivar que funcionam bem.
fonte
Um método de extensão ToCsv () de uso geral:
Exemplos de uso:
Implementação
fonte
Aqui está o meu método de extensão, ele retorna uma string por simplicidade, mas minha implementação grava o arquivo em um data lake.
Ele fornece qualquer delimitador, adiciona aspas à string (caso elas contenham o delimitador) e as transações serão nulas e vazias.
Uso:
fonte