在 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

我还有一个布局键:

块引用

    Lo​​cation-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# 中解析:拆分字符串并应用布局键来创建表的主要内容,如果未能解决你的问题,请参考以下文章

将字符串拆分(不解析)到命令行参数 C# [重复]

在 C# 中的两个特殊字符之间拆分分层字符串

如何首先“将字符串拆分为数组”然后“向该数组添加内容”? || C# 控制台应用程序

如何拆分字符串 C# 并忽略字符串中的不完整单词

如何在C#中将带逗号的字符串拆分为两个字符串[重复]

C# 从 .txt 读取并拆分为结构数组