将文本数据转换成多维数组
本文关键字:数组 转换 文本 数据 | 更新日期: 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 Name
、Last Name
、Middle 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 Name
、Middle Name
或Last 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()
来获取每列中的值。