2011-10-14 63 views
6

Giả sử tôi có một chuỗi có văn bản: "Đây là KIỂM TRA". Làm thế nào tôi sẽ chia nó ra mỗi n ký tự? Vì vậy, nếu n là 10, sau đó nó sẽ hiển thị:C# ngắt dòng mỗi n ký tự

"THIS IS A " 
"TEST" 

..bạn có ý tưởng. Lý do là bởi vì tôi muốn chia một đường rất lớn thành những đường nhỏ hơn, giống như quấn từ. Tôi nghĩ rằng tôi có thể sử dụng string.Split() cho điều này, nhưng tôi không có ý tưởng làm thế nào và tôi đang bối rối.

Mọi trợ giúp sẽ được đánh giá cao.

+1

thể trùng lặp của [C# Chia một chuỗi thành những phần bằng nhau của kích thước 4] (http://stackoverflow.com/questions/1450774/c-sharp-split-a-string-into-equal-chunks-each-of-size-4) –

Trả lời

16

Hãy mượn một thực hiện từ my answer trên xem xét mã. Đây chèn một dòng bẻ gãy mọi n ký tự:

public static string SpliceText(string text, int lineLength) { 
    return Regex.Replace(text, "(.{" + lineLength + "})", "$1" + Environment.NewLine); 
} 

Edit:
Để trả về một mảng các chuỗi thay vì:

public static string[] SpliceText(string text, int lineLength) { 
    return Regex.Matches(text, ".{1," + lineLength + "}").Cast<Match>().Select(m => m.Value).ToArray(); 
} 
2

Bạn sẽ có thể sử dụng regex cho việc này. Dưới đây là một ví dụ:

//in this case n = 10 - adjust as needed 
List<string> groups = (from Match m in Regex.Matches(str, ".{1,10}") 
         select m.Value).ToList(); 

string newString = String.Join(Environment.NewLine, lst.ToArray()); 

Tham khảo cho câu hỏi này để biết chi tiết:
Splitting a string into chunks of a certain size

1

Có lẽ không phải là cách tối ưu nhất, nhưng không có regex:

string test = "my awesome line of text which will be split every n characters"; 
int nInterval = 10; 
string res = String.Concat(test.Select((c, i) => i > 0 && (i % nInterval) == 0 ? c.ToString() + Environment.NewLine : c.ToString())); 
+0

Tốt hơn nên sử dụng 'String.Concat()' thay vì tham gia một chuỗi rỗng. –

+0

cảm ơn mẹo! – Peter

3

Có thể điều này có thể được sử dụng để xử lý các tệp cực lớn có hiệu quả:

public IEnumerable<string> GetChunks(this string sourceString, int chunkLength) 
{ 
    using(var sr = new StringReader(sourceString)) 
    { 
     var buffer = new char[chunkLength]; 
     int read; 
     while((read= sr.Read(buffer, 0, chunkLength)) == chunkLength) 
     { 
      yield return new string(buffer, 0, read); 
     }   
    } 
} 

Thực ra, tính năng này hoạt động với bất kỳ TextReader nào. StreamReader là phổ biến nhất được sử dụng TextReader. Bạn có thể xử lý các tệp văn bản rất lớn (tệp nhật ký IIS, tệp nhật ký SharePoint, v.v.) mà không phải tải toàn bộ tệp, nhưng đọc nó theo từng dòng.

1

Coming lại vấn đề này sau khi làm một bài đánh giá mã, có một cách khác để làm như vậy mà không sử dụng Regex

public static IEnumerable<string> SplitText(string text, int length) 
{ 
    for (int i = 0; i < text.Length; i += length) 
    { 
     yield return text.Substring(i, Math.Min(length, text.Length - i)); 
    } 
} 
Các vấn đề liên quan