2010-04-10 24 views
6

Tôi đã thử nghiệm với tệp VB.Net cơ bản IO và tách chuỗi. Tôi gặp phải vấn đề này. Tôi không biết liệu nó có liên quan gì đến File IO hay tách chuỗi.Sự cố với tệp IO và tách chuỗi bằng Environment.NewLine trong VB.Net

Tôi viết văn bản vào một tập tin như vậy

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

Sau đó, tôi đọc văn bản từ tập tin

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

Bây giờ, tôi đang tách fileContents sử dụng Environment.NewLine là dấu phân cách.

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

Khi tôi in các mảng kết quả, tôi nhận được một số kết quả kỳ lạ

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

Tôi được thêm vào * s đến đầu và kết thúc của các mục Mảng trong in ấn, để tìm hiểu những gì đang xảy ra . Vì NewLine được sử dụng làm dấu phân tách, tôi mong đợi các chuỗi trong Mảng không có bất kỳ dòng mới nào. Nhưng sản lượng là này -

*FirstItem* 
* 
SecondItem* 
* 
ThirdItem* 
* 
* 

nên không nó được điều này -

*FirstItem* 
*SecondItem* 
*ThirdItem* 
** 

??

Tại sao có một dòng mới ở đầu tất cả trừ chuỗi đầu tiên?

Cập nhật: tôi đã làm một nhân vật bằng cách in nhân vật của fileContents và nhận này -

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 

Dường như 'Environment.NewLine' bao gồm

- 13 

- 10 

13 và 10 .. Tôi hiểu không. Nhưng không gian trống ở giữa? Tôi không biết liệu nó có đến do in trên bảng điều khiển hay thực sự là một phần của NewLine. Vì vậy, khi chia tách, chỉ có ký tự tương đương với giá trị ASCII 13, là ký tự đầu tiên của NewLine, được sử dụng làm dấu phân tách (như được giải thích trong phần trả lời) và phần còn lại vẫn còn tồn tại trong các chuỗi. Đối với một số lý do, không gian trống bí ẩn trong danh sách ở trên và giá trị ASCII 10 cùng nhau dẫn đến một dòng mới đang được in.

Hiện đã rõ. Cảm ơn đã giúp đỡ. :)

+0

Ký tự 13 là vận chuyển hàng hóa, 10 là nguồn cấp dữ liệu đường. Đó là lý do tại sao nó xuất hiện như một dòng trống trong kết quả của bạn, * bởi vì nó in một dòng mới *. Nếu câu trả lời trả lời câu hỏi của bạn, hãy chắc chắn chấp nhận câu hỏi này :) –

+0

Hey .. ahem .. thanks: D: D – Senthil

Trả lời

6

Trước hết, có, WriteLine gắn trên dòng mới vào cuối chuỗi, do đó dòng trống ở cuối.

Vấn đề là cách bạn đang gọi fileContents.Split(). Phiên bản duy nhất của hàm đó chỉ nhận một đối số là char(), không phải là string. Environment.NewLine là một chuỗi, không phải là char, vì vậy (giả sử bạn có Option Strict Off) khi bạn gọi hàm, nó chuyển đổi hoàn toàn thành một số char, chỉ sử dụng ký tự đầu tiên trong chuỗi.Điều này có nghĩa là thay vì tách chuỗi của bạn trên chuỗi thực của hai ký tự tạo thành Environment.NewLine, nó thực sự chỉ tách trên ký tự đầu tiên của các ký tự đó.

Để có được kết quả mong muốn của bạn, bạn cần phải gọi nó như thế này:

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

Điều này sẽ gây ra nó để chia trên chuỗi thực tế, chứ không phải là ký tự đầu tiên là nó làm gì bây giờ, và nó sẽ loại bỏ bất kỳ mục nhập trống nào từ kết quả.

+0

Bằng cách đó không hoàn toàn đúng, nó chỉ sử dụng char đầu tiên của chuỗi, để lại tất cả \ n ký tự trong các chuỗi được chia nhỏ. –

+1

Hoặc chỉ cần đi học cũ và sử dụng Split (fileContents, vbNewLine) –

+1

@Chris: Mà sẽ để lại một nhân vật 'CR' vô dụng ở cuối tất cả các chuỗi. –

3

Tại sao không chỉ sử dụng File.ReadAllLines? Một cuộc gọi duy nhất đọc tệp và trả về một mảng chuỗi với các dòng.

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

Xin chào, Có .. Tôi đã sử dụng điều đó ngay từ đầu. Nhưng khi vấn đề xảy ra, tôi nghĩ tôi đã làm sai File IO. Tôi muốn đảm bảo rằng vấn đề không phải là cách tôi đọc và ghi vào các tệp, vì vậy tôi đã chuyển sang StreamReader và StreamWriter (những điều tôi quen thuộc với các trải nghiệm mã hóa trước đó). Tôi quên quay lại. Cảm ơn vì đề nghị tốt đẹp anyway :) – Senthil

0

Tôi vừa gặp sự cố tương tự và thấy tất cả các nhận xét rất hữu ích. Tuy nhiên, tôi đã khắc phục sự cố của mình bằng cách thay thế "Environment.NewLine" bằng vbLF (trái với vbCrLf, có cùng vấn đề). Bất kỳ vấn đề với cách tiếp cận này? (Nó có vẻ thẳng hơn, nhưng tôi không phải là một lập trình viên, vì vậy tôi sẽ không biết về bất kỳ vấn đề tiềm năng nào).

+0

Nên thêm ví dụ – iMortalitySX

Các vấn đề liên quan