2012-11-18 5 views
7

Ho usato MyString.Split(Environment.Newline.ToCharArray()[0]) per dividere la mia stringa da un file in parti diverse. Ma ogni elemento dell'array, ad eccezione del primo, inizia con \ n dopo che l'ho fatto? So che il modo in cui sto dividendo da newline è una specie di "cheaty" per mancanza di una parola migliore, quindi se c'è un modo migliore per farlo, per favore dimmi ...Dividere le stringhe usando Ambiente.Newline lascia n nella maggior parte degli elementi dell'array?

Ecco il file. .. enter image description here

+0

Quindi ogni record è quello che ti aspetti da una nuova riga di un file? – Jared

+0

sì, è come 123 \ n 123 \ n 123 \ n 123 – Oztaco

+1

Vuoi pubblicare il tuo file di input da qualche parte sulla linea? Solo le prime righe sono sufficienti. –

risposta

14

Se si vogliono mantenere utilizzando il .Split() invece di leggere un file in una linea alla volta si può fare ...

var splitResult = MyString.Split(new string[]{ System.Environment.NewLine }, 
    System.StringSplitOptions.RemoveEmptyEntries ); 
    /* or System.StringSplitOptions.None if you want empty results as well */ 

EDIT:

il problema che stavano avendo è in un non enix envi ronment il "personaggio" di nuova riga è in realtà due caratteri. Quindi, quando hai afferrato l'indice zero che stavi effettivamente dividendo in un ritorno a capo ... non il carattere di nuova riga (\ n).

di Windows = "\ r \ n"

Unix = "\ n"

Per http://msdn.microsoft.com/en-us/library/system.environment.newline.aspx

+0

Mi chiedo perché è "\ r \ n" invece di "\ n" ... grazie, questo funziona – Oztaco

+2

Chiedi a Microsoft :) – Jared

1

Una nuova linea di Windows è di due caratteri (\ r \ n). L'espressione Environment.Newline.ToCharArray()[0] specifica solo uno di quei caratteri: \ r. Pertanto, l'altro carattere (\ n) rimane come parte della stringa divisa.

mio vi consiglio di leggere il file utilizzando qualcosa di simile:

public IEnumerable<string> ReadFile(string filePath) 
{ 
    using (StreamReader rdr = new StreamReader(filePath)) 
    { 
     string line; 
     while ((line = reader.ReadLine()) != null) 
     { 
      yield return line; 
     } 
    } 
} 

Potrebbe essere necessario più la gestione degli errori, o per specificare l'opzione aprire il file di diverso, o per passare un flusso di metodo più che il percorso, ma l'idea di utilizzare un iteratore sul metodo ReadLine() è audio. Il risultato è che puoi semplicemente usare un codice come questo:

foreach (string line in ReadLine(" ... my file path ... ")) 
{ 

} 
+0

parentesi fyi accoppiate correttamente nel primo blocco di codice. – Jared

+0

@jared capito, grazie per aver individuato l'errore di battitura –

+0

, ho provato a correggere ma la modifica non era composta da sei caratteri ... – Jared