首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何替换以特定单词开头、以C#中的特殊字符结尾的文本文件中的字符串?

如何替换以特定单词开头、以C#中的特殊字符结尾的文本文件中的字符串?
EN

Stack Overflow用户
提问于 2020-12-11 15:53:27
回答 2查看 229关注 0票数 0

我正在开发一个应用程序,通过读取和写入文本文件来提供生产过程的管理。首先,它从文本文件中读取信息并将信息放入一个datagridview,如下所示:

然后,应该可以在更改单元格值时更新文本文件中的信息。

下面是测试文件示例:

567、Eindhoven、IGT、21、剥_e=20/05/2020、剥离_e=21/05/2020、Stripping_f=、清洁_e=23/05/2020、清洁_s=27/05/2020、清洁_f=28/05/2020、油漆_e=28/05/2020、油漆_f=28/05/2020、油漆_f=29/05/2020、内阁_e=29/05/2020、内阁_s=31/05/2020、Cabinet_f=、Table_e=、Table_s=、表_f=05/06/2020、Stand=05/06/2020、Stand_s=08/06/2020,Stand_f=,Display_e=08/06/2020,Display_s=11/06/2020,Display_f=,UControls_e=15/06/2020,UControls_s=,UControls_f=,Test_e=19/06/2020,Test_s=,Test_f=20/06/2020,Prepack_e=21/06/2020,Prepack_s=22/06/2020,Prepack_f=,Endpack_e=27/06/2020,Endpack_s=28/06/2020,Endpack_f=,Release_e=30/06/2020,Release_s=,Release_f=,

我想要做的基本上是将存储在文件中的日期替换为输入到单元格中的新日期。例如,对于Cleaning_e=23/05/2020,,我想检查字符串是否以Cleaning_e=开头,以,结尾,将其替换为Cleaning_e=12/09/2020,,即在单元格中输入新日期。

我目前的代码是:

代码语言:javascript
复制
private void ExportToTextFile(int selectedDate)
        {
            string filename = dataGridView1.Rows[clickedRow].Cells[0].Value.ToString();
           // TextWriter writer = new StreamWriter($"../../{filename}.txt");
            var text = new StringBuilder();

            foreach (string s in File.ReadAllLines($"../../{filename}.txt"))
            {
               /* if (clickedColumn == 3 && selectedDate == 0)
                    text.AppendLine(s.Replace("Stripping_e=", $"Stripping_e={dataGridView1.Rows[clickedRow].Cells[clickedColumn].Value.ToString()}"));
                else if (clickedColumn == 3 && selectedDate == 1)
                    text.AppendLine(s.Replace("Stripping_s=", $"Stripping_s={dataGridView1.Rows[clickedRow].Cells[clickedColumn].Value.ToString()}"));
                else if (clickedColumn == 3 && selectedDate == 2)
                    text.AppendLine(s.Replace("Stripping_f=", $"Stripping_f={dataGridView1.Rows[clickedRow].Cells[clickedColumn].Value.ToString()}"));
                else if (clickedColumn == 3 && selectedDate == 3)
                    text.AppendLine(s.Replace("Stripping_d=", $"Stripping_d={dataGridView1.Rows[clickedRow].Cells[clickedColumn].Value.ToString()}"));
                else */if (clickedColumn == 4 && selectedDate == 0)
                {
                    text.AppendLine(s.Replace("Cleaning_e=", $"Cleaning_e={dataGridView1.Rows[clickedRow].Cells[clickedColumn].Value.ToString()}"));
                    
                }/*
                else if (clickedColumn == 4 && selectedDate == 1)
                    text.AppendLine(s.Replace("Cleaning_s=", $"Cleaning_s={dataGridView1.Rows[clickedRow].Cells[clickedColumn].Value.ToString()}"));
                else if (clickedColumn == 4 && selectedDate == 2)
                    text.AppendLine(s.Replace("Cleaning_f=", $"Cleaning_f={dataGridView1.Rows[clickedRow].Cells[clickedColumn].Value.ToString()}"));
                else if (clickedColumn == 4 && selectedDate == 3)
                    text.AppendLine(s.Replace("Cleaning_d=", $"Cleaning_d={dataGridView1.Rows[clickedRow].Cells[clickedColumn].Value.ToString()}"));*/
            }
            using (var file = new StreamWriter(File.Create($"../../{filename}.txt")))
            {
                file.Write(text.ToString());
            }

        }

在我完成text.AppendLine(s.Replace("Cleaning_e=",$"Cleaning_e={dataGridView1.Rows[clickedRow].Cells[clickedColumn].Value.ToString()}"));之后,它写进了文件:Cleaning_e=12/09/202023/05/2020

如何确保在追加新日期之前删除输入的旧日期?

我尝试删除此字符串并将其写入已删除字符串的索引中,但无法使其工作。我也尝试使用regex,但没有成功。

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-11 16:25:05

为了用Regex替换它,可以使用

代码语言:javascript
复制
var testText = "some other stuff Cleaning_e=12/43/4555, some more ";
var newValue = "78/65/0000";
var rx = new Regex(@"Cleaning_e=(\d\d/\d\d/\d\d\d\d)?");
var result = rx.Replace(testText, $"Cleaning_e={newValue}");

这将取代日期。请注意,这将取代每次出现的Cleaning_e,并要求日期格式准确地具有轴向2、2和4位数字。如果数字的数目不同,则可以使用

代码语言:javascript
复制
var rx = new Regex(@"Cleaning_e=(\d+/\d+/\d+)?");

而不是。

我宁愿重新注释,将其解析为一个适当的结构,并在那里更改值,而不是直接操作文本文件。

票数 2
EN

Stack Overflow用户

发布于 2020-12-11 16:28:48

如果是我..。我首先通过在命令中拆分所有字段来解析该文件(使用string.Split):

代码语言:javascript
复制
private const string SomeStuff =
    "567,Eindhoven,IGT,21,Stripping_e=20/05/2020,Stripping_s=21/05/2020,Stripping_f=,Cleaning_e=23/05/2020,Cleaning_s=27/05/2020,Cleaning_f=28/05/2020,Paint_e=28/05/2020,Paint_s=28/05/2020,Paint_f=29/05/2020,Cabinet_e=29/05/2020,Cabinet_s=31/05/2020,Cabinet_f=,Table_e=,Table_s=,Table_f=05/06/2020,Stand_e=05/06/2020,Stand_s=08/06/2020,Stand_f=,Display_e=08/06/2020,Display_s=11/06/2020,Display_f=,UControls_e=15/06/2020,UControls_s=,UControls_f=,Test_e=19/06/2020,Test_s=,Test_f=20/06/2020,Prepack_e=21/06/2020,Prepack_s=22/06/2020,Prepack_f=,Endpack_e=27/06/2020,Endpack_s=28/06/2020,Endpack_f=,Release_e=30/06/2020,Release_s=,Release_f=,";
var fields = SomeStuff.Split(new[]{','}, StringSplitOptions.None);

在这一点上,您将有一个字符串集合。然后创建一个正则表达式,如下所示:

代码语言:javascript
复制
private const string ParsePattern = @"(?<key>[a-zA-Z0-9_]+)=(?<date>\d{2}/\d{2}/\d{4})";
private static readonly Regex ParseRegex = new Regex(ParsePattern);

该正则表达式查找任意数量的字母、数字或下划线,后面跟着"=“,后面跟着两个数字,一个斜杠,另一个两个数字,另一个斜杠,最后还有四个数字。等号之前的"group“将被命名为"key”,而在等号之后的日期将被命名为" date“。

最后,我构建了一个没有日期的字段列表和一个包含字段名/日期组合的字典:

代码语言:javascript
复制
var noDateStrings = new List<string>();
var dateDictionary = new Dictionary<string, DateTime>();

在had中,我会循环遍历已解析的字符串集合。如果与regex匹配,我会把这两个组件放到字典中。如果没有匹配,我就把它们塞进我的不匹配的List<string>

代码语言:javascript
复制
foreach (var field in fields)
{
    var patternMatches = ParseRegex.Matches(field);
    if (patternMatches.Count == 0)
    {
        noDateStrings.Add(field);
    }
    else
    {
        var groups = patternMatches[0].Groups;
        var date = DateTime.ParseExact(groups["date"].ToString(), "dd/mm/yyyy",
            CultureInfo.InvariantCulture);
        dateDictionary.Add(groups["key"].ToString(), date);
    }
}

你在这里有你想做的事所需要的所有信息。

最后要注意的是。在解析事物时,我几乎总是主张使用TryParse而不是Parse。但是,在本例中,我知道字符串与日期模式匹配。除非该字符串表示非法日期(例如32/13/2020),否则它将解析为罚款。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65254532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档