C# 读取文本文件和增量字符串版本

C# 读取文本文件和增量字符串版本,c#,parsing,file-io,replace,C#,Parsing,File Io,Replace,我正在用c#编写一个小应用程序。其中我必须读取文本文件并更新特定的数字(+1)。有人能帮我吗 序列号“主要版本号”。“次要版本号”。“服务包号” (仅将次要版本号更新为+1,Sr编号的第二位数字) 问题之一是如何处理串行线的定位,有时它包含:SerialNo:和有时srno 文本文件信息如下 Product Code: Prd1001 Description: Item 1 SerialNo : 1.0.0 Mfg Date: 12/Jan/2017 更新后 Product Code: P

我正在用c#编写一个小应用程序。其中我必须读取文本文件并更新特定的数字(+1)。有人能帮我吗

序列号“主要版本号”。“次要版本号”。“服务包号” (仅将次要版本号更新为+1,Sr编号的第二位数字)

问题之一是如何处理串行线的定位,有时它包含:
SerialNo:
和有时
srno

文本文件信息如下

Product Code: Prd1001
Description:  Item 1
SerialNo :  1.0.0
Mfg Date: 12/Jan/2017
更新后

Product Code: Prd1001
Description:  Item 1
SerialNo :  1.1.0
Mfg Date: 12/Jan/2017

更新后

Product Code: Prd1001
Description:  Item 1
Sr No 1.2.1 
Mfg Date: 12/Jan/2017
有人能帮我吗


感谢有关如何更新第一种文件格式的示例代码:

var text = "Product Code: Prd1001\r\nDescription:  Item 1\r\nSerialNo :  1.0.0\r\nMfg Date: 12/Jan/2017";
var updatedText = "";

foreach(var line in text.Split(new string[] { Environment.NewLine }, StringSplitOptions.None))
{
    if(line.StartsWith("SerialNo"))
    {
        var parts = line.Split(new char[] { ':' });
        var serial = parts[1].Trim().Split(new char[] { '.' });

        var majorVersionNo = int.Parse(serial[0]);
        var minorVersionNo = int.Parse(serial[1]);
        var servicePackNo = int.Parse(serial[2]);

        // Make updates. Example:
        servicePackNo++;

        updatedText += "SerialNo : " + majorVersionNo + "." + minorVersionNo + "." + servicePackNo + Environment.NewLine;

    }
    else
    {
        updatedText += line + Environment.NewLine;
    }
}

Debug.Write(updatedText);

我建议使用
Sub
,它允许您处理要增加的版本索引的类型

  • 版本索引=0增加主要版本
  • 版本索引=1增量次要版本
  • 版本索引=2增加服务包版本
您可以轻松调用此选项来更改次要版本,例如:

ChangeVersion("c:\test.txt", 1)
我决定使用一种简单的方法读取每一行并检查它是否包含串行运算符,然后根据所选设置分解您的行以隔离版本和增量

为了定位第一次出现的版本,我使用了
IndexOfAny
,然后是
CharArray
,因为它比使用
Regex
更快,内存消耗更少。 下面是函数:

'Version Index = 0 increment Major Version
'Version Index = 1 increment Minor Version
'Version Index = 2 increment Service Pack Version
Public Sub ChangeVersion(ByVal FilePath As String, ByVal VersionIndex As Integer)
    Dim lines() As String = IO.File.ReadAllLines(FilePath)
    For i = 0 To lines.Count - 1
        Dim line As String = lines(i)
        If line.Contains("Sr No") Or line.Contains("SerialNo") Then
            Dim ix As Integer = line.IndexOfAny("1234567890".ToCharArray)
            Dim early As String = line.Substring(0, ix)
            Dim sversions() As String = Split(line.Remove(0, ix), ".")
            If VersionIndex = 0 Then
                sversions(0) = CInt(sversions(0)) + 1
            ElseIf VersionIndex = 1 Then
                sversions(1) = CInt(sversions(1)) + 1
            ElseIf VersionIndex = 2 Then
                sversions(2) = CInt(sversions(2)) + 1
            Else
                MsgBox("Version Index Error")
            End If
            Dim NewVersion As New Version(sversions(0), sversions(1), sversions(2))
            lines(i) = early & NewVersion.ToString
        End If
    Next
    IO.File.WriteAllLines(FilePath, lines)
End Sub

File.ReadAllLines然后,对于每一行,只需检查是否包含Sr No或SerialNo,如果它确实修改了该行,则显示到目前为止您有哪些代码不起作用。请检查@Mederic到底是什么问题?对您过去的做法没有任何解释,或者为什么您只回答了一半的问题,因为您只考虑了一种可能性描述。如果你只是发布代码,至少要给出最低限度的解释,并使其完整,那么非常感谢你的快速回复。我将实现它。@Mederic请注意,代码公开了清晰的变量名和基本的、自解释的函数。在我看来,这不需要进一步的评论,因为它们只会降低可读性。还要注意的是,这只是一个示例解决方案,OP可以轻松地对其进行更新。代码是否必须处理多个文件格式,或者是否只建立了一种格式还不清楚。
'Version Index = 0 increment Major Version
'Version Index = 1 increment Minor Version
'Version Index = 2 increment Service Pack Version
Public Sub ChangeVersion(ByVal FilePath As String, ByVal VersionIndex As Integer)
    Dim lines() As String = IO.File.ReadAllLines(FilePath)
    For i = 0 To lines.Count - 1
        Dim line As String = lines(i)
        If line.Contains("Sr No") Or line.Contains("SerialNo") Then
            Dim ix As Integer = line.IndexOfAny("1234567890".ToCharArray)
            Dim early As String = line.Substring(0, ix)
            Dim sversions() As String = Split(line.Remove(0, ix), ".")
            If VersionIndex = 0 Then
                sversions(0) = CInt(sversions(0)) + 1
            ElseIf VersionIndex = 1 Then
                sversions(1) = CInt(sversions(1)) + 1
            ElseIf VersionIndex = 2 Then
                sversions(2) = CInt(sversions(2)) + 1
            Else
                MsgBox("Version Index Error")
            End If
            Dim NewVersion As New Version(sversions(0), sversions(1), sversions(2))
            lines(i) = early & NewVersion.ToString
        End If
    Next
    IO.File.WriteAllLines(FilePath, lines)
End Sub