2010-04-10 6 views
6

Eksperymentowałem z podstawowym podziałem plików IO pliku VB.Net i ciągów. Napotkałem ten problem. Nie wiem, czy ma to coś wspólnego z podziałem plików IO lub String.Problem z plikami IO i rozszczepianie łańcuchów za pomocą środowiska Environment.NewLine w VB.Net

piszę tekst do pliku jak tak

Dim sWriter As New StreamWriter("Data.txt") 
sWriter.WriteLine("FirstItem") 
sWriter.WriteLine("SecondItem") 
sWriter.WriteLine("ThirdItem") 
sWriter.Close() 

Następnie Czytam tekst z pliku

Dim sReader As New StreamReader("Data.txt") 
Dim fileContents As String = sReader.ReadToEnd() 
sReader.Close() 

Teraz jestem dzielenie fileContents użyciu Environment.NewLine jako ogranicznik.

Dim tempStr() As String = fileContents.Split(Environment.NewLine) 

Kiedy drukować wynikowej tabeli, mam dziwne wyniki

For Each str As String In tempStr 
    Console.WriteLine("*" + str + "*") 
Next 

dodałem * S na początku i na końcu elementów macierzy podczas drukowania, aby dowiedzieć się, co się dzieje . Ponieważ jako ogranicznik używano NewLine, oczekiwałem, że łańcuchy w tablicy nie mają żadnych linii NewLine. Ale wynik był ten -

*FirstItem* 
* 
SecondItem* 
* 
ThirdItem* 
* 
* 

Nie powinien to być ten -

*FirstItem* 
*SecondItem* 
*ThirdItem* 
** 

??

Dlaczego na początku wszystkich oprócz pierwszego ciągu pojawia się nowa linia?

Aktualizacja: Zrobiłem znak po znaku wydruku z fileContents i dostał to -

F - 70 
i - 105 
r - 114 
s - 115 
t - 116 
I - 73 
t - 116 
e - 101 
m - 109 
- 13 

- 10 
S - 83 
e - 101 
c - 99 
o - 111 
n - 110 
d - 100 
I - 73 
t - 116 
e - 101 
m - 109 
- 13 

- 10 
T - 84 
h - 104 
i - 105 
r - 114 
d - 100 
I - 73 
t - 116 
e - 101 
m - 109 
- 13 

- 10 

Wydaje 'Environment.NewLine' składa się z

- 13 

- 10 

13 i 10 .. I Rozumiesz. Ale pusta przestrzeń pomiędzy? Nie wiem, czy nadchodzi z powodu drukowania na konsoli, czy naprawdę jest częścią NewLine.

Tak więc, podczas dzielenia, jako separator (jak wyjaśniono w odpowiedziach) używany jest tylko znak odpowiadający wartości ASCII 13, która jest pierwszym znakiem NewLine, a pozostałe elementy są nadal obecne w łańcuchach. Z jakiegoś powodu tajemnicze puste miejsce na powyższej liście oraz wartość 10 ASCII razem powodują drukowanie nowej linii.

Teraz jest jasne. Dzięki za pomoc. :)

+0

Znak 13 to powrót karetki, 10 to wiersz. Dlatego pojawia się jako pusty wiersz w wynikach, * ponieważ drukuje nową linię *. Jeśli odpowiedź na Twoje pytanie została udzielona, ​​pamiętaj, aby ją zaakceptować :) –

+0

Hej ... ahem .. dzięki: D: D – Senthil

Odpowiedz

6

Przede wszystkim tak, WriteLine halsuje na linii prostej do końca łańcucha, stąd pusta linia na końcu.

Problem polega na tym, że dzwonisz pod numer fileContents.Split(). Jedyną wersją tej funkcji, która przyjmuje tylko jeden argument, jest char(), a nie string. Environment.NewLine to ciąg znaków, a nie char, więc (zakładając, że masz Option Strict Off), gdy wywołujesz funkcję, to niejawnie konwertujesz ją na char, używając tylko pierwszego znaku w ciągu.Oznacza to, że zamiast rozdzielać ciąg znaków na rzeczywistą sekwencję dwóch znaków składających się na Environment.NewLine, faktycznie dzieli się tylko na pierwszą z tych znaków.

Aby uzyskać pożądany wynik, trzeba nazwać tak:

Dim delims() as String = { Environment.NewLine } 
Dim tempStr() As String = fileContents.Split(delims, _ 
          StringSplitOptions.RemoveEmptyEntries) 

Spowoduje to podzielić na rzeczywistej ciąg, zamiast pierwszego znaku, jak to robi teraz, i będzie to usunąć wszelkie puste wpisy z wyników.

+0

Przy okazji nie jest to całkowicie poprawne, po prostu używa pierwszego znaku ciągu, pozostawiając wszystko \ n znaki w podzielonych łańcuchach. –

+1

Lub po prostu przejdź do starej szkoły i użyj Split (fileContents, vbNewLine) –

+1

@Chris: Co pozostawi bezużyteczny znak 'CR' na końcu wszystkich ciągów znaków. –

3

Dlaczego po prostu nie używać File.ReadAllLines? Jedno wywołanie odczytuje plik i zwraca tablicę znaków z liniami.

Dim tempStr() As String = File.ReadAllLines("data.txt") 
+0

Cześć, tak .. Używałem tego na początku. Ale kiedy wystąpił problem, myślałem, że robię plik IO źle. Chciałem się upewnić, że problem nie jest taki, jak czytam i zapisuję pliki, więc przełączyłem się na StreamReader i StreamWriter (rzeczy, które znam z wcześniejszych doświadczeń z kodowaniem). Zapomniałem wrócić. Dzięki za dobrą sugestię i tak :) – Senthil

0

Po prostu wpadłem na ten sam problem i uznałem, że wszystkie komentarze są bardzo pomocne. Jednak poprawiłem swój problem, zastępując "Environment.NewLine" przez vbLF (w przeciwieństwie do vbCrLf, który miał ten sam problem). Jakieś problemy z tym podejściem? (Wydaje się to bardziej proste, ale nie jestem programistą, więc nie wiedziałbym o potencjalnych problemach).

+0

Należy dodać przykład – iMortalitySX

Powiązane problemy