gpt4 book ai didi

c# - 如何读取文本文件并循环遍历重复部分?

转载 作者:太空狗 更新时间:2023-10-30 00:53:54 25 4
gpt4 key购买 nike

我有一个 ANSI 835(文本)文件。为了简单起见,它看起来像这样:

ISA*00
GS*Foo*12345
ST*835*000001
LX*1
CLP*123456
NM1*Lastname
REF*010101
DTM*20120512
SVC*393939
LQ*19
LX*2
CLP*23456
NM1*Smith
REF*58774
DTM*20120601
SVC*985146
LX*3
CLP*34567
NM1*Doe
REF*985432
DTM*20121102
SVC*864253
LQ*19
LQ*84

记录被分成 LX 段。 LX*1 之后的所有内容都是一条记录,LX*2 之后的所有内容都是另一条记录,依此类推。我需要从每一行中获取某些项目,将它们分配给变量,并最终将它们作为一行添加到数据 GridView 中。再次为了简单起见,我有以下变量,这是每个变量应该包含的内容:

string ItemNumber 应该是CLP行中*后面的字符组
string LastName应该是NM1行中*后面的字符组
string Date 应该是 REF 行中 * 之后的字符组
string Error应该是LQ行中*后面的字符组

我面临的最大问题是每个 LX 段中可能有不止一条 LQ 线路。在这种情况下,可以将第二个错误添加到第一个错误的末尾,用逗号分隔。

我尝试将文件加载到一个字符串数组中并逐行进行,但我不确定“从 LX*1 开始并执行某些操作直到达到 LX*2”是怎么说的。

string[] lines = File.ReadAllLines(MyFile);

foreach (string line in lines)
{
string[] splitline = line.Split('*');

if (splitline[0] = "LX")
{
//this is where i need to loop through the next lines
//until i hit the next line starting with LX.
}
}

有什么想法吗?一如既往,感谢您的宝贵时间!

最佳答案

从一个简单的数据模型开始:

public class LXRecord
{
public string ItemNumber { get; set; }
public string LastName { get; set; }
public string Date { get; set; }
public List<string> Errors { get; set; }

public LXRecord()
{
Errors = new List<String>();
}
}

定义您的重要标记:

public static class Tokens
{
public const string TOKEN_SPLITTER = "*";
public const string NEW_RECORD = "LX";
public const string ITEM_NUMBER = "CLP";
public const string LAST_NAME = "NM1";
public const string DATE = "REF";
public const string ERROR = "LQ";
}

遍历这些行,对标记进行 switch/case,并在看到“LX”标志时开始一个新的 LXRecord:

List<LXRecord> records = new List<LXRecord>();
LXRecord currentRecord = null;

foreach(string line in lines)
{
int tokenIndex = line.IndexOf(Tokens.TOKEN_SPLITTER);
if (tokenIndex < 1 || tokenIndex == line.Length - 1) //no token or no value?
continue;

string token = line.Substring(0, tokenIndex);
string value = line.Substring(tokenIndex + 1);

switch(token)
{
case(Tokens.NEW_RECORD) :
currentRecord = new LXRecord();
records.Add(currentRecord);
break;
case(Tokens.ITEM_NUMBER) :
currentRecord.ItemNumber = value;
break;
case(Tokens.LAST_NAME) :
currentRecord.LastName = value;
break;
case(Tokens.DATE) :
currentRecord.Date = value;
break;
case(Tokens.ERROR) :
currentRecord.Errors.Add(value);
break;
}
}

请注意,通过这种方式,您可以相对轻松地忽略不受支持的标志、添加新标志或添加解析(例如,ItemNumber 可以使用 Int32.Parse 并将其存储为整数,或者“日期”可以存储 DateTime )在这种情况下, 我选择将错误存储为 List<String> ,但如果您愿意,可以用逗号分隔它。我还避免在 * 字符处拆分,以防内容也包含第二个星号。

编辑:根据您的评论,您可以在 case 中进行一些更复杂/专门的解析或移至另一种方法。而不是我上面的“LAST_NAME”的情况,你可以:

case(Tokens.LAST_NAME) :
ParseName(currentRecord, value);
break;

ParseName 在哪里:

public static void ParseName(LXRecord record, string value)
{
int tokenIndex = value.IndexOf(Tokens.TOKEN_SPLITTER);
if (tokenIndex < 1 || tokenIndex == value.Length - 1) //no last name and first name?
{
record.LastName = value;
}
else
{
record.LastName = value.Substring(0, tokenIndex);
record.FirstName = value.Substring(tokenIndex + 1);
}
}

token 检查可能会在那里进行调整,但它应该会给您一个好主意。

关于c# - 如何读取文本文件并循环遍历重复部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14738673/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com