将文本数据转换成多维数组

本文关键字:数组 转换 文本 数据 | 更新日期: 2023-09-27 18:17:34

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

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 number-null
  • 客户名称可以有First NameLast 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 NameLast Name必须保存在同一个目录中数组元素。
  • Account Number在数组元素中必须为空

将文本数据转换成多维数组

我建议您学习使用TextFieldParser类。是的,在微软里。VisualBasic命名空间,但您可以在c#中使用它。该类允许您轻松解析具有固定字段宽度的文本文件。有关示例,请参阅文章如何:在Visual Basic中从固定宽度的文本文件中读取。同样,这个示例是用Visual Basic编写的,但它应该很容易转换成c#。

如果您愿意做出妥协,在帐户值中不区分-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);
}

要绕过带有单个空格的名称,您可以尝试使用双空格分隔而不是单个空格:

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

这仍然不能解决列中没有值的问题。看起来你的文本文件中所有的东西都在一个特定的位置。Seq在16号位置,Account 1在20号位置,等等。

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