如何解决将多个空格从文本文件拆分为数组
我有一个文本文件,要求将所有7个元素(包括空元素)解析为数组以进行进一步处理。但是,除了空白以外,没有唯一的定界符可以使用,并且某些数据/值将随空白一起提供。每个“数据样本”的示例,其中一些块将具有空条目。我该如何做到这一点?
我的最终结果将类似于以下内容:
Array[0]:123456789
Array[1]:HLTX
Array[2]:5
Array[3]:BT5Q02
Array[4]:4SV
Array[5]:D8041
Array[6]:LIANG LIN
我现在对下面函数的代码如下,它将忽略空值。可能会错过一些所需的数据。
string[] splitlinecontent = line.Split(new char[] { ' ' },StringSplitOptions.RemoveEmptyEntries);
var OrderNum = splitlinecontent[0];
var OrderType = splitlinecontent[1];
int OrderQTY = int.Parse(splitlinecontent[2]);
var OrderSINumInRpt = splitlinecontent[3];
var OrderHoldMod = splitlinecontent[5];
var SalesPerson = splitlinecontent[6];
解决方法
我认为这些文件的最佳实践是使用Microsoft.VisualBasic.FileIO中的TextFieldParser;
using (var parser = new TextFieldParser(fileName))
{
parser.TextFieldType = FieldType.FixedWidth;
parser.SetFieldWidths(3,7,10,13,8,6,1,-1);
while (!parser.EndOfData)
{
var fields = parser.ReadFields();
但是我想自己编写东西并不难。
,根据示例数据的屏幕截图,您的列的固定字符大小为10个字符。现在,您可以简单地逐行读取样本数据,并按此固定大小分割行。
public static List<List<string>> GetRecords(string path,bool hasColHeader,int colLength,int colCount){
//Result will be stored in lists
List<List<string>> result = new List<List<string>>();
//Get the sample file
string[] records = File.ReadAllLines(path,Encoding.UTF8);
//Go for each line through the data from sample file
for(int n = 0; n<records.Length;n++){
//create new list for this line
result.Add(new List<string>());
//here you can do something with headers. for simplification i do nothing with them and continue with next line.
if(n==0 && hasColHeader){
continue;
}
//go for each column (colCount specifies the count of columns)
for(int i = 0; i< colCount ;i++){
//if the length of the line is not devisible by colLength,you have to put some spaces to match the columns size
//not the best way to do this but this is not the major point of this question
if(records[n].Length % colLength != 0){
int charsToAdd = (colLength * colCount) - records[n].Length;
string spaces = "";
for(int s = 0; s< charsToAdd; s++){
spaces += " ";
}
records[n] += spaces;
}
//add the result to the currently created list
result[n].Add(records[n].Substring(i*colLength,colLength).Trim());
}
}
return result;
}
您可以使用以下代码:
static void Main(string[] args)
{
List<List<String>> list = GetRecords(@"C:\temp\DataSample.txt",true,7);
}
列表中的数据如下:
List[0]:List[0]:123456789
List[0]:List[1]:HLTX
List[0]:List[2]:5
List[0]:List[3]:BT5Q02
List[0]:List[4]:4SV
List[0]:List[5]:D8041
List[0]:List[6]:LIANG LIN
List[1]:List[0]:3835443
List[1]:List[1]:HLTX
List[1]:List[2]:1
...
在这里您可以自己优化两件事。
- 通过标题之间的字符计算列的大小。列大小将始终是列标题的开始和下一个列标题的开始。这两个点之间的字符数将是列的大小。
- 找到一种更好的方法来获取最后一列! :D我不认为我所做的是好的。有更好的方法可以做到这一点。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。