在C#中将文本数据转换为多维数组:

时间:2013-06-07 11:37:42

标签: c#

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

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必须留空。

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

3 个答案:

答案 0 :(得分:1)

我建议您学习使用TextFieldParser课程。是的,它位于Microsoft.VisualBasic命名空间中,但您可以从C#中使用它。该类使您可以轻松地解析具有固定字段宽度的文本文件。有关示例,请参阅文章How to: Read From Fixed-width Text Files in Visual Basic。同样,示例是在Visual Basic中,但它应该很容易转换为C#。

答案 1 :(得分: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);
}

答案 2 :(得分:0)

要解决其中包含单个空格的名称,您可以尝试拆分双空格而不是单个空格:

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

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

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