2

我有一个以下字符串,在文本文件中有换行符:

Card No.      Seq     Account 1   Account 2  Account 3  Account 4   Customer Name          Expiry   Status

0100000184998  1   2500855884500                 -          -       /NIRMAL PRADHAN          1302     Cold
0100000186936  1                      -          -          -       /RITA SHRESTHA           1302     Cold
0100000238562  1   2500211214500                 -          -       /HARRY SHARMA            1301     Cold
0100000270755  0   1820823730100      -          -                  /EXPRESS ACCOUNT         9999     Cold
0100000272629  0   1820833290100      -          -          -       /ROMA MAHARJAN           1208     Cold
0100000272637  0   2510171014500      -                     -       /NITIN KUMAR SHRESTHA    1208     Cold
0100000272645  0   1800505550100      -          -          -       /DR HARI BHATTA          1208     Cold

这里,

  • Card No.,Seq有固定的数字。
  • Account 1, Account 2, Account 3, Account 4可以有fixed digit numberor-null.
  • 客户名称可以有First Name,Last NameMiddle Name

我想要的结果是:

array[0][0] = "0100000184998"
array[0][1] = "1"
array[0][2] = "2500855884500"
array[0][3] = " "
array[0][4] = "-"
array[0][6] = "NIRMAL PRADHAN "

array[1][0] = "0100000186936"
array[1][1] = "1"
array[1][3] = " "
array[1][4] = "-"

在这里,我尝试的是:

 var sourceFile = txtProcessingFile.Text;
string contents = System.IO.File.ReadAllText(sourceFile);
    var newarr =  contents.Split(new char[]{ '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries)
    .Select (x => 
      x.Split(new char[]{ ' ' }, StringSplitOptions.RemoveEmptyEntries).ToArray()
    ).ToArray();


DataTable dt = new DataTable("NewDataTable");   


dt.Columns.Add("CardNo");
dt.Columns.Add("SNo");
dt.Columns.Add("Account1");
and so on...

for (int row = 0; row < newarr.Length; row++)
{

   for (int col = 0; col < newarr[col].Length; col++)
   {
      dt.Rows.Add(newarr[row]);
      row++;

   }


}

如果数据字段不为空并且客户名称只是名字或分隔符,则此方法可以正常工作。

但是,我想要得到的是:

  • First NameMiddle Name或者Last Name必须存储在同一个数组元素中。
  • Account Number如果数组元素为空,则必须留空。

    如何将其正确存储在数据表上?

4

3 回答 3

1

我建议你学习使用TextFieldParser类。是的,它位于 Microsoft.VisualBasic 命名空间中,但您可以从 C# 中使用它。该类使您可以轻松解析具有固定字段宽度的文本文件。有关示例,请参阅文章如何:在 Visual Basic 中读取固定宽度的文本文件。同样,该示例使用 Visual Basic,但应该很容易转换为 C#。

于 2013-06-07T13:08:34.270 回答
0

要绕过名称中包含单个空格的名称,您可以尝试使用双空格而不是单个空格进行拆分:

x.Split(new string[]{ "  " }

这仍然无法解决其中没有价值的列的问题。您的文本文件似乎在特定位置包含所有内容。Seq在第 16 位,Account 1在第 20 位,等等。

一旦您的行存储在 中newarr,您可能只想使用String.Substring()with.Trim()来获取每列中的值。

于 2013-06-07T12:14:45.970 回答
0

-如果您愿意在不影响帐户值和null值之间做出妥协,您可以试试这个:

var sourceFile = txtProcessingFile.Text;
string[] contents = System.IO.File.ReadAllLines(sourceFile);
DataTable dt = new DataTable("NewDataTable");

dt.Columns.Add("CardNo");
dt.Columns.Add("SNo");
dt.Columns.Add("Account1");
dt.Columns.Add("Account2");
dt.Columns.Add("Account3");
dt.Columns.Add("Account4");
dt.Columns.Add("CustomerName");
dt.Columns.Add("Expiry");
dt.Columns.Add("Status");

for (int row = 2; row < contents.Length; row++)
{
    var newRow = dt.NewRow();
    var regEx = new Regex(@"([\w]*)");
    var matches = regEx.Matches(contents[row].ToString())
        .Cast<Match>()
        .Where(m => !String.IsNullOrEmpty(m.Value))
        .ToList();
    var numbers = matches.Where(m => Regex.IsMatch(m.Value, @"^\d+$")).ToList();
    var names = matches.Where(m => !Regex.IsMatch(m.Value, @"^\d+$")).ToList();
    for (int i = 0; i < numbers.Count() - 1; i++)
    {
        newRow[i] = numbers.Skip(i).First();
    }
    newRow[newRow.ItemArray.Length - 2] = numbers.Last();
    newRow[newRow.ItemArray.Length - 1] = names.Last();
    newRow[newRow.ItemArray.Length - 3] = names.Take(names.Count() - 1).Aggregate<Match, string>("", (a, b) => a += " " + b.Value);
    dt.Rows.Add(newRow);
}
于 2013-06-07T12:13:08.743 回答