我正在开发一个应用程序,通过读取和写入文本文件来提供生产过程的管理。首先,它从文本文件中读取信息并将信息放入一个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,,即在单元格中输入新日期。
我目前的代码是:
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,但没有成功。
提前感谢!
发布于 2020-12-11 16:25:05
为了用Regex替换它,可以使用
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位数字。如果数字的数目不同,则可以使用
var rx = new Regex(@"Cleaning_e=(\d+/\d+/\d+)?");而不是。
我宁愿重新注释,将其解析为一个适当的结构,并在那里更改值,而不是直接操作文本文件。
发布于 2020-12-11 16:28:48
如果是我..。我首先通过在命令中拆分所有字段来解析该文件(使用string.Split):
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);在这一点上,您将有一个字符串集合。然后创建一个正则表达式,如下所示:
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“。
最后,我构建了一个没有日期的字段列表和一个包含字段名/日期组合的字典:
var noDateStrings = new List<string>();
var dateDictionary = new Dictionary<string, DateTime>();在had中,我会循环遍历已解析的字符串集合。如果与regex匹配,我会把这两个组件放到字典中。如果没有匹配,我就把它们塞进我的不匹配的List<string>
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),否则它将解析为罚款。
https://stackoverflow.com/questions/65254532
复制相似问题