2012-07-06 15 views
7

tarafından alt dizeleri içine bir dize ...Bölünmüş Şöyle verilere sahibiz sabit genişlikte

, daha küçük alt dizeleri var bu verileri bölmek için en etkili yolu nedir Benim sorum
1 TESTAAA  SERNUM A DESCRIPTION 
    2 TESTBBB  ANOTHR ANOTHER DESCRIPTION 
    3 TESTXXX  BLAHBL 

olduğunu yüzlerce çizgi olacak gibi. Ayrıca, bazı satırların son sütun eksik olacak. Ben regex yapmaya çalıştım ama genişlikleri için kullandığım desen ile başarılı değildi. Yukarıdaki veriler (aşağıda listelenen her sütunun uzunluğu) Bu alanlara yıkmak gerekir

{id} {firsttext} {serialhere} {description} 
4 22   6   30+ 

kimse yardım etmek veya bilgileri ayıklamak için iyi bir regex eşleştirme kalıbını önerebilirsiniz?

sayesinde Simon

cevap

7

aşağıdaki regex deneyin t birbiri içine koşun, sonra da daha basit bir şey deneyin:

line.Split(" ") 
6

Aslında doğrudan String.Substring ile bunu yapma yöntemi yazma öneriyoruz. Bu, tam gerekli genişlikleri vermede daha etkili olacaktır.

(o dize dolgu şerit yok kasıtlı denenmemiş, ve olsa da) Bu büyük olasılıkla çalışacaktır:

public static string[] SplitFixedWidth(string original, bool spaceBetweenItems, params int[] widths) 
{ 
    string[] results = new string[widths.Length]; 
    int current = 0; 

    for (int i = 0; i < widths.Length; ++i) 
    { 
     if (current < original.Length) 
     { 
      int len = Math.Min(original.Length - current, widths[i]); 
      results[i] = original.Substring(current, len); 
      current += widths[i] + (spaceBetweenItems ? 1 : 0); 
     } 
     else results[i] = string.Empty; 
    } 

    return results; 
} 

Doğrudan bir Stream veya metin dosyasından bu okuyorsanız söyleniyor, TextFieldParser kullanarak Verileri doğrudan sabit genişlikli veri olarak okumayı sağlar. MSDN'de bu bağlantıyı dışarı

+0

TextFieldParse herhangi bir Stream veya TextReader'dan okuyabilir, s o fiziksel bir dosyaya gitmek zorunda değildir. –

+0

@SteveDog Evet - verilerin bir Akışta olması gerekiyor. Bu nadiren de olsa bir sorundur, ama zaten (bir nedenden dolayı) işlemiş olduğunuz bir dizi dizisi veya bunun gibi bir şeyiniz varsa onu yerleştirmem. Bu söyleniyor, bu bilgi –

+0

Hayır eklemek için düzenlenmiş, ben de bir TextReader alacağını söylüyorum, bu yüzden sadece yeni TextFieldParser (yeni StringReader ("veri")) 'gibi başlatabilirsiniz. Akış gerektirmez. –

5

Kontrol:

http://msdn.microsoft.com/en-us/library/zezabash.aspx

Temelde, TextFieldParser sınıf şey tam olarak bu tür yapar. Ayrıca CSV dosyaları gibi ayrılmış verileri okumak için harika bir yoldur. Microsoft, her ne sebeple olursa olsun Microsoft.VisualBasic.FileIO ad alanı altına koymayı seçti, bu gerçekten rahatsız edici çünkü VB ile ilgisi yok.

Örneğin, bu gibi kullanmak olabilir: değerleri her zaman boş olmayan ve (yani, onlar don' boşluk ile ayrılmış iseniz

(.{4})(.{22})(.{6})(.+)? 

:

TextFieldParser parser = new TextFieldParser(new StringReader(fixedWidthData)); 
parser.TextFieldType = FieldType.FixedWidth; 
parser.SetFieldWidths(4, 22, 6, -1); 
while (!parser.EndOfData) 
{ 
    string[] row = parser.ReadFields(); 
}