我有一个跟随字符串,在文本文件中有换行符:
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
必须留空。
如何将其正确存储在数据表上?
答案 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()
一起使用以获取每列中的值。