在 C# 中解析:拆分字符串并应用布局键来创建表
Posted
技术标签:
【中文标题】在 C# 中解析:拆分字符串并应用布局键来创建表【英文标题】:Parsing in C#: Splitting a string and applying a layout key to create a table 【发布时间】:2020-12-06 03:51:06 【问题描述】:我已经退出编程游戏几年了,所以我很生疏 - 感觉就像我从头开始,所以如果这是一个新手问题,我很抱歉。
我有一个包含订单项的文本文件:
> 076-5000-3ABBOTT 1998010700019900119971205000
048-0002-8ABINGDON 1998010700019900119971205000
100-5000-3ABSHER 1998010700019900119971205000
我还有一个布局键:
块引用
-
Location-Code-Id PIC X(10) 值“xxx-xxxx-x”
位置名称 PIC X(25)
Current-Rate-Effective-Date PIC X(6) 值“CCYYMM”
Total-Current-Telecom-Rate PIC 9(5) A 7.00% rate 为 07000
Previous-Rate-Effective-Date PIC X(6) 值“CCYYMM”
Previous-Rate-Ending-Date PIC X(6) 值“CCYYMM”
Total-Previous-Telecom-Rate PIC 9(5) A 7.00% rate 为 07000
每个字符串的总长度为 63。我基本上需要将字符串按 PIC X 长度拆分,然后将它们转换为标题,即。 “Location-code-Id”,最终将成为列标题。
这是我目前拥有的:
class ReadFromFile
static void Main()
string[] lines = System.IO.File.ReadAllLines(@"C:\Files\test.txt");
// Display the file contents by using a foreach loop.
System.Console.WriteLine("Contents of test.txt = ");
foreach (string s in lines)
string s = s;
foreach (char c in s)
if (s.Length = 10)
Console.WriteLine(s.Length);
else if (s.Length = 35)
Console.WriteLine(s.Length);
else
Console.WriteLine(s);
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
System.Console.ReadKey();
这段代码显然不起作用,我还没有写它来打印文本,我只是想打印出当前的长度位置,以便我可以从那里开始。此刻很失落。我最终想将其转换为 JSON 或 CSV。任何帮助将不胜感激,非常感谢。
【问题讨论】:
你可以做一个拆分:var arr = lineFromFile.Split(' ', StringSplitOptions.RemoveEmptyEntries);
你的数组中有两个元素。
这需要分成 7 个元素 - 镜像密钥。我相信您所说的会将行项目分成两半,其中有空格以创建两个元素示例:元素 1 - 076-5000-3ABBOTT,元素 2 - 1998010700019900119971205000。它需要是元素 1 - 076-5000-3(长度10)、元素 2 - “ABBOTT”(长度 25)、元素 3 - 199801(长度 6)、元素 4 - 07000(长度 5)、元素 5 - 199001(长度 6)等...
在每个元素上使用substring
以获得您想要的。您基本上只是在上面的评论中编写了代码。
快速示例:var locationCode = s.Substring(0, 10); var locationName = s.Substring(10, 25); etc...
这是fixed-width text,不是 CSV 也不是 JSON。
【参考方案1】:
您可以使用 substring 方法和 Parsing 创建一个新对象,以后可以使用 LINQ 过滤和查询。
List<string> lines = new List<string>()
"076-5000-3ABBOTT 1998010700019900119971205000",
"048-0002-8ABINGDON 1998010700019900119971205000",
"100-5000-3ABSHER 1998010700019900119971205000"
;
var data = lines.Select(x => new
Code = x.Substring(0, 10),
Name = x.Substring(10, 25),
CREDT = DateTime.ParseExact(x.Substring(35, 6), "yyyyMM", CultureInfo.InvariantCulture),
TCTR = double.Parse(x.Substring(41,5))/1000,
PREDT = DateTime.ParseExact(x.Substring(46, 6), "yyyyMM", CultureInfo.InvariantCulture),
PRENDT= DateTime.ParseExact(x.Substring(52, 6), "yyyyMM", CultureInfo.InvariantCulture),
RPETR = double.Parse(x.Substring(58, 5))/1000
);
// data would look like this as an array,
[
"Code": "076-5000-3",
"Name": "ABBOTT ",
"CREDT": "1998-01-01T00:00:00",
"TCTR": 7.0,
"PREDT": "1990-01-01T00:00:00",
"PRENDT": "1997-12-01T00:00:00",
"RPETR": 5.0
,
"Code": "048-0002-8",
"Name": "ABINGDON ",
"CREDT": "1998-01-01T00:00:00",
"TCTR": 7.0,
"PREDT": "1990-01-01T00:00:00",
"PRENDT": "1997-12-01T00:00:00",
"RPETR": 5.0
,
"Code": "100-5000-3",
"Name": "ABSHER ",
"CREDT": "1998-01-01T00:00:00",
"TCTR": 7.0,
"PREDT": "1990-01-01T00:00:00",
"PRENDT": "1997-12-01T00:00:00",
"RPETR": 5.0
]
【讨论】:
以上是关于在 C# 中解析:拆分字符串并应用布局键来创建表的主要内容,如果未能解决你的问题,请参考以下文章