Eu preciso dividir uma seqüência de caracteres em novas linhas no .NET e a única maneira que eu sei de dividir seqüências é com o método Split . No entanto, isso não me permitirá (facilmente) dividir em uma nova linha; então, qual é a melhor maneira de fazer isso?
806
Respostas:
Para dividir em uma string, você precisa usar a sobrecarga que requer uma matriz de strings:
Editar:
se você quiser lidar com diferentes tipos de quebras de linha em um texto, poderá usar a capacidade de corresponder a mais de uma sequência. Isso será dividido corretamente em qualquer tipo de quebra de linha e preservará linhas e espaçamento vazios no texto:
fonte
Environment.NewLine
propriedade contém a nova linha padrão para o sistema. Para um sistema Windows, por exemplo, será"\r\n"
.\n
deixar um\r
no final de cada linha e, em seguida, gera as linhas com um\r\n
entre eles.\r
e\n
escape (entre outras) têm um significado especial para o compilador C #. O VB não possui essas seqüências de escape; portanto, essas constantes são usadas.Que tal usar um
StringReader
?fonte
while
loop que deve ser adicionado a essa resposta.Você deve poder dividir sua string com muita facilidade, assim:
fonte
Tente evitar o uso de string.Split para uma solução geral, porque você usará mais memória em todos os lugares em que usar a função - a string original e a cópia dividida, ambas na memória. Confie em mim que isso pode ser um problema enorme quando você começa a escalar - execute um aplicativo de processamento em lote de 32 bits que processa documentos de 100 MB e você terá a mínima ideia de oito threads simultâneos. Não que eu já estive lá antes ...
Em vez disso, use um iterador como este;
Isso permitirá que você faça um loop mais eficiente de memória em torno de seus dados;
Obviamente, se você quiser tudo na memória, poderá fazer isso;
fonte
blah.SplitToLines..
por exemplodocument.SplitToLines...
?this
os parâmetros formais, tornando-o um método de extensão.Com base na resposta de Guffa, em uma classe de extensão, use:
fonte
Para uma variável de sequência
s
:Isso usa a definição do seu ambiente de terminações de linha. No Windows, as terminações de linha são CR-LF (retorno de carro, avanço de linha) ou nos caracteres de escape do C #
\r\n
.Esta é uma solução confiável, porque se você recombinar as linhas
String.Join
, isso será igual à sua string original:O que não fazer:
StringSplitOptions.RemoveEmptyEntries
, pois isso interromperá a marcação, como Markdown, onde as linhas vazias têm um propósito sintático.new char[]{Environment.NewLine}
, porque no Windows isso criará um elemento de sequência vazio para cada nova linha.fonte
Regex também é uma opção:
fonte
"\r?\n"
.Eu apenas pensei em adicionar meus dois bits, porque as outras soluções nessa questão não se enquadram na classificação de código reutilizável e não são convenientes.
O seguinte bloco de código estende o
string
objeto para que ele esteja disponível como um método natural ao trabalhar com seqüências de caracteres.Agora você pode usar a
.Split()
função de qualquer sequência da seguinte maneira:Para dividir um caractere de nova linha, basta passar
"\n"
ou"\r\n"
como o parâmetro delimitador.Comentário: Seria bom se a Microsoft implementasse essa sobrecarga.
fonte
Environment.Newline
é preferível à codificação codificada\n
ou\r\n
.Environment.Newline
é para compatibilidade de plataforma cruzada, não para trabalhar com arquivos que usam terminações de linha diferentes do sistema operacional atual. Veja aqui para mais informações , portanto depende realmente do que o desenvolvedor está trabalhando. O uso deEnvironment.Newline
garante que não haja consistência no tipo de retorno de linha entre os sistemas operacionais, onde a 'codificação permanente' oferece ao desenvolvedor controle total..Newline
não é mágico, sob o capô são apenas as seqüências de caracteres fornecidas acima, com base em uma opção de se ele está sendo executado no unix ou no windows. A aposta mais segura é primeiro substituir uma string por todos "\ r \ n" e depois dividir em "\ n". Onde o uso.Newline
falha, é quando você está trabalhando com arquivos salvos por outros programas que usam um método diferente para quebras de linha. Funciona bem se você souber sempre que o arquivo lido estiver sempre usando as quebras de linha do seu sistema operacional atual.foo = foo.Replace("\r\n", "\n"); string[] result = foo.Split('\n');
. Estou entendendo corretamente que isso funciona em todas as plataformas?Atualmente, estou usando esta função (com base em outras respostas) no VB.NET:
Ele tenta dividir primeiro a nova linha local da plataforma e depois recair em cada nova linha possível.
Eu só precisava disso dentro de uma classe até agora. Se isso mudar, provavelmente vou fazer isso
Public
e movê-lo para uma classe de utilitário, e talvez até torná-lo um método de extensão.Veja como juntar as linhas de volta, para uma boa medida:
fonte
"\r"
= retorno."\r\n"
= retorno + nova linha. (revise este post e a solução aceita aquiBem, na verdade, a divisão deve fazer:
fonte
A opção RemoveEmptyStrings garantirá que você não tenha entradas vazias devido a \ n após um \ r
(Edite para refletir os comentários :) Observe que ele também descartará linhas vazias genuínas no texto. Geralmente é isso que eu quero, mas pode não ser sua exigência.
fonte
Eu não sabia sobre o Environment.Newline, mas acho que essa é uma solução muito boa.
Minha tentativa teria sido:
O .Trim adicional remove qualquer \ r ou \ n que ainda possa estar presente (por exemplo, quando estiver no Windows, mas dividindo uma string com caracteres de nova linha os x). Provavelmente não é o método mais rápido.
EDITAR:
Como os comentários apontaram corretamente, isso também remove qualquer espaço em branco no início da linha ou antes do novo avanço de linha. Se você precisar preservar esse espaço em branco, use uma das outras opções.
fonte
Resposta boba: escreva em um arquivo temporário para poder usar o venerável
File.ReadLines
fonte
var
, pois ele não define o tipo de variável, portanto você pode não entender como usar esse objeto ou o que esse objeto representa. Além disso, isso mostra a escrita das linhas e nem sequer especifica um nome de arquivo, então duvido que funcione. Em seguida, ao ler, o caminho para o arquivo novamente não é especificado. Supondo quepath
sejaC:\Temp\test.txt
, você deve terstring[] lines = File.ReadLines(path);
.Path.GetTempFileName
msdn.microsoft.com/en-us/library/… e ele diz que cria um arquivo de zero byte e retorna "o caminho completo desse arquivo". Eu poderia jurar que tentei isso antes e isso deu uma exceção porque não encontrou um arquivo, mas foi retornada uma localização de pasta. Conheço os argumentos para usarvar
, mas diria que NÃO é recomendado porque não mostra qual é o objeto variável. O ofusca.fonte
Muito fácil, na verdade.
VB.NET:
C #:
fonte
Environment.NewLine
como no VB.