Estou tentando gravar em um csv
arquivo linha por linha usando a linguagem C #. Aqui está a minha função
string first = reader[0].ToString();
string second=image.ToString();
string csv = string.Format("{0},{1}\n", first, second);
File.WriteAllText(filePath, csv);
Toda a função é executada dentro de um loop, e cada linha deve ser gravada no csv
arquivo. No meu caso, a próxima linha substitui a linha existente e, no final, estou recebendo um único registro no arquivo csv, que é o último. Como posso escrever todas as linhas do csv
arquivo?
StringBuilder
e faça um salvar?Util.WriteCsv (mydatacollection, @"c:\temp\data.csv");
Respostas:
ATUALIZAR
Nos meus dias ingênuos, sugeri fazer isso manualmente (era uma solução simples para uma pergunta simples); no entanto, devido a isso se tornar cada vez mais popular, eu recomendaria o uso da biblioteca CsvHelper que faz todas as verificações de segurança etc.
O CSV é muito mais complicado do que o que a pergunta / resposta sugere.
Resposta original
Como você já tem um loop, considere fazer o seguinte:
Ou algo nesse sentido. Meu raciocínio é: você não precisará gravar no arquivo para cada item, apenas abrirá o fluxo uma vez e depois gravará nele.
Você pode substituir
com
se você deseja manter as versões anteriores do csv no mesmo arquivo
C # 6
Se você estiver usando o c # 6.0, poderá fazer o seguinte
EDITAR
Aqui está um link para uma pergunta que explica o que
Environment.NewLine
faz.fonte
{2}
eEnvironment.NewLine
e usarAppendLine
em vez deAppend
System.Globalization.CultureInfo.CurrentCulture.TextInfo.ListSeparator
vez de vírgula.Eu recomendo que você siga a rota mais tediosa. Especialmente se o tamanho do seu arquivo for grande.
File.AppendAllText()
abre um novo arquivo, grava o conteúdo e depois fecha o arquivo. Abrir arquivos é uma operação com muitos recursos, do que gravar dados em fluxo aberto. Abrir / fechar um arquivo dentro de um loop causará queda no desempenho.A abordagem sugerida por Johan resolve esse problema armazenando toda a saída na memória e depois escrevendo-a uma vez. No entanto (no caso de arquivos grandes), o programa consumirá uma grande quantidade de RAM e até travará com
OutOfMemoryException
Outra vantagem da minha solução é que você pode implementar a pausa \ retomando salvando a posição atual nos dados de entrada.
upd. Colocado usando no lugar certo
fonte
using
instrução Caso contrário, você vai reabrir o arquivo o tempo todo repetidamente.A gravação manual de arquivos CSV pode ser difícil, pois seus dados podem conter vírgulas e novas linhas. Sugiro que você use uma biblioteca existente.
Esta pergunta menciona algumas opções.
Existem bibliotecas de leitores / gravadores de CSV em C #?
fonte
Eu uso uma solução de duas análises, pois é muito fácil manter
fonte
File.AppendAllLines(filePath, lines, Encoding.ASCII);
vez deFile.WriteAllText(filePath, csv.ToString());
Então, estou fazendo algo muito desajeitado. Depois de criar o csv usando StringBuilder, eu o converto em uma List <string> para obter um IEnumerable para a chamada a AppendAllLines, que não aceita csv.ToString () como parâmetro:List<string> lines = new List<string>(); lines.Add(csv.ToString(0, csv.Length));
você tem uma maneira melhor de fazer isso?Em vez de ligar todas as vezes,
AppendAllText()
você pode pensar em abrir o arquivo uma vez e depois escrever o conteúdo inteiro uma vez:fonte
Basta usar AppendAllText:
A única desvantagem do AppendAllText é que ele gera erro quando o arquivo não existe, portanto, isso deve ser verificadoDesculpe, momento loiro antes de ler a documentação . De qualquer forma, o método WriteAllText substitui tudo o que foi gravado anteriormente no arquivo, se o arquivo existir.
Observe que seu código atual não está usando novas linhas apropriadas; por exemplo, no Bloco de notas, você verá tudo isso como uma linha longa. Altere o código para isso para ter novas linhas apropriadas:
fonte
Em vez de reinventar a roda, uma biblioteca poderia ser usada.
CsvHelper
é ótimo para criar e ler arquivos csv. Suas operações de leitura e gravação são baseadas em fluxo e, portanto, também suportam operações com uma grande quantidade de dados.Você pode escrever seu csv da seguinte maneira.
Como a biblioteca está usando reflexão, ela pega qualquer tipo e a analisa diretamente.
Se você quiser ler mais sobre as configurações e possibilidades das bibliotecas, faça isso aqui .
fonte
fonte
.Replace(",", ";") + ','
:?Manipulação de vírgulas
Para manipular vírgulas dentro dos valores ao usar
string.Format(...)
, o seguinte funcionou para mim:Então, para combiná-lo com a resposta de Johan, ficaria assim:
Retornando arquivo CSV
Se você simplesmente deseja retornar o arquivo em vez de gravá-lo em um local, este é um exemplo de como eu o realizei:
De um procedimento armazenado
De uma lista
Espero que isso seja útil.
fonte
Este é um tutorial simples sobre a criação de arquivos csv usando C # que você poderá editar e expandir para atender às suas próprias necessidades.
Primeiro, você precisará criar um novo aplicativo de console do Visual Studio C #. Existem etapas a seguir para fazer isso.
O código de exemplo criará um arquivo csv chamado MyTest.csv no local que você especificar. O conteúdo do arquivo deve ter 3 colunas nomeadas com texto nas 3 primeiras linhas.
https://tidbytez.com/2018/02/06/how-to-create-a-csv-file-with-c/
fonte
Você pode apenas precisar adicionar um feed de linha
"\n\r"
.fonte
Aqui está outra biblioteca de código aberto para criar arquivos CSV facilmente, o Cinchoo ETL
Para mais informações, leia o artigo do CodeProject sobre uso.
fonte
Uma maneira simples de se livrar do problema de substituição é usar
File.AppendText
para acrescentar linhas no final do arquivo, comofonte
string string_value = string.Empty;
fonte
Isso deve permitir que você escreva um arquivo csv de maneira bastante simples. Uso:
fonte