2015-09-07 62 views
1

如果我有一个.txt文件以下标题:复杂级联的两个标题

 CUSTOMER    PAYMENT  ERR CORR PAYMENT AMOUNT  PAYMENT 
    REFERENCE NUMBER INSTRUCTION TYPE REASON*      TYPE** 

如何创建具有下列元素的List<string>

CUSTOMER REFERENCE NUMBERPAYMENT INSTRUCTION TYPEERR CORR REASON*PAYMENT AMOUNTPAYMENT TYPE**

又如:

 CUSTOMER    PAYMENT  ERR CORR PAYMENT AMOUNT  PAYMENT 
    REFERENCE NUMBER INSTRUCTION TYPE         TYPE** 

会给我: CUSTOMER REFERENCE NUMBERPAYMENT INSTRUCTION TYPEERR CORRPAYMENT AMOUNTPAYMENT TYPE**

注意,标题由许多空格隔开> = 2,而在一个标题的每个单词被一个空格分开。标题只能写在第一行是可能的。

回答

2

这里有一种方法。首先,将两条线合并在一起。我假设它们的长度相同。例如:

var s1 = " CUSTOMER    PAYMENT  ERR CORR PAYMENT AMOUNT  PAYMENT "; 
var s2 = " REFERENCE NUMBER INSTRUCTION TYPE REASON*      TYPE** "; 

var merged = new string(Enumerable.Range(0, s1.Length) 
    .Select(t=>s1[t]!=' ' ? s1[t] : s2[t]).ToArray()); 

到此你是这样的:

REFCUSTOMERUMBER INSTPAYMENT TYPE ERRACORR PAYMENT AMOUNT  PAYMENT 

然后,查找双(或更多)的空间在该字符串索引:

var indexes = Regex.Matches(merged, @" +").OfType<Match>().Select(t=>t.Index).ToList(); 

然后,使用这些将两个字符串剪切并将它们连接起来的索引,修剪掉空白。我明确地添加了字符串的开始和结尾,以防末尾没有双空白。

indexes.Insert(0, 0); 
indexes.Add(merged.Length-1); 

indexes.Sort(); // not sure if Regex.Matches will necessarily be in order 

var columns = new List<string>(); 
for (int i=0; i<indexes.Count-1;i++) 
{ 
    var column = (
     s1.Substring(indexes[i], indexes[i+1]-indexes[i]).Trim() + " " + 
     s2.Substring(indexes[i], indexes[i+1]-indexes[i]).Trim() 
     ).Trim(); 
    if (column != string.Empty) 
     columns.Add(column); 
} 

这可以让你的输出:

CUSTOMER REFERENCE NUMBER 
PAYMENT INSTRUCTION TYPE 
ERR CORR REASON* 
PAYMENT AMOUNT 
PAYMENT TYPE** 

而且here是一个工作的例子。

+0

我终于开始使用这个解决方案。 绝对优雅,我的解决方案涉及更多的代码行,很高兴能够使用这一个,谢谢。 –

0

如果TXT的格式,就像你说的,这里是一个演示

string[] arr = { 
          @" CUSTOMER    PAYMENT  ERR CORR PAYMENT AMOUNT  PAYMENT 
REFERENCE NUMBER INSTRUCTION TYPE REASON*      TYPE**", 
                      @"  CUSTOMER    PAYMENT  ERR CORR PAYMENT AMOUNT  PAYMENT 
REFERENCE NUMBER INSTRUCTION TYPE         TYPE**" 
         }; 
foreach (string str in arr) 
{ 
    List<string> list = new List<string>(); 
    var tmp = Regex.Split(str.Trim(), @"\s{2,}"); 
    list.Add(tmp[0] + " " + tmp[5]); 
    list.Add(tmp[1] + " " + tmp[6]); 
    if (tmp.Length == 9) 
    { 
     list.Add(tmp[2] + " " + tmp[7]); 
    } 
    else 
    { 
     list.Add(tmp[2]); 
    } 
    list.Add(tmp[3]); 
    list.Add(tmp[4] + " " + tmp[tmp.Length - 1]); 
    Console.WriteLine(string.Join(",", list)); 
} 
+0

那里有硬编码的数字。如果标题被添加或修改,这会工作吗? –