繁体   English   中英

从文件读取特定数据

[英]Reading specific data from file

我想从bat文件中读取特定数据(设置值),然后将它们写入Textbox1.Text(这些是我要读取的文件的第一行),我想获取值

XXXXX写入Textbox1.Text

YYYYY写入Textbox2.Text

ZZZZZ写入Textbox3.Text

SSSSS写入Textbox4.Text

   @echo off


   :::::: DANE LOGOWANIA DO BAZY DANYCH
   :: Baza danych
   set DB=XXXXX
   :: Serwer Bazy danych
   set DBServer=YYYYY
   :: Login do bazy danych
   set DBUser=ZZZZZ
   :: Hasło do bazy danych
   set DBPassword=SSSSS

从文件读取应从

   private void mssqlbutton_Click(object sender, EventArgs e)
   {

   }

然后,如果有人更改了Textbox1.Text值,它将以先前读取的位置将这些值写入文件。

我已经尝试过使用正则表达式寻找解决方案,按行阅读,但这对我不起作用,或者我根本不知道该怎么做。

确切地说,我刚刚开始使用C#冒险,所以我还不那么熟悉,所以如果您能向我解释一下,而不是只提供代码,我将不胜感激:)

编辑:实际上,它不是那么小,整个bat文件是这样的: http : //wklej.to/sCQ6i (我知道最后删除了bat文件,但我会处理)

和AppCode: http ://wklej.to/Z5IFd

在AppCode中, DBServerInput.Text was Textbox1.Text DBInput.Text was Textbox2.Text DBUserInput.Text was Textbox3.Text DBPasswordInput was Textbox4.Texte

那么,您在哪里被卡住? 但是,第一个要求相对容易:

private void ButtonReadBatch_Click(object sender, EventArgs e)
{
    string[] linesToShowInTextBox = File.ReadLines(@"C:\Temp\batchTest.bat")
        .Select(l => l.Trim())
        .Where(l => l.StartsWith("set ", StringComparison.InvariantCultureIgnoreCase) && l.Contains('='))
        .Select(l => l.Split('=').Last().TrimStart())
        .ToArray();
    TextBox1.Lines = linesToShowInTextBox;
}

第二个比较复杂,这应该给您一个想法。 经过初步测试:

private void ButtonSumbitTextboxChangesToBatch_Click(object sender, EventArgs e)
{
    string[] lines = textBox1.Lines;
    if (lines.Length != 0)
    {
        int matchIndex = 0;
        var lineInfos = File.ReadLines(@"C:\Temp\batchTest.bat")
            .Select(l => l.Trim())
            .Select((line, index) => {
                bool isSetLine = line.StartsWith("set ", StringComparison.InvariantCultureIgnoreCase) && line.Contains('=');
                return new{ 
                    line, index, isSetLine,
                    setIndex = isSetLine ? matchIndex++ : -1 
                };
            });
        string[] newLines = lineInfos
            .Select(x => !x.isSetLine || x.setIndex >= lines.Length 
                ? x.line 
                : string.Format("set {0}={1}",
                    x.line.Split(' ')[1].Split('=')[0].Trim(),
                    lines[x.setIndex]))
            .ToArray();
        File.WriteAllLines(@"C:\Temp\batchTest.bat", newLines);
    }
}

因此,不要使用TextChanged事件,而要使用另一个按钮,否则将在导致不希望的效果的任何更改上调用该事件。

您可以使用System.IO.File-class及其静态方法从文件中读取数据。 特别是方法ReadAllLines应该可以为您提供帮助。 因此,您可以遍历行或使用索引进行寻址。 foreachfor循环应该起作用。 字符串类为您提供了解构读取的数据的工具,可以考虑使用方法SplitIndexOf 也可以使用System.IO.File -class将数据写回到文件中。 最简单的方法应该是使用所有值覆盖整个文件,因为数据量非常少。 考虑使用System.IO.File -class中的AppendLine -Method

给定的MSDN链接应该为您的研究提供一个良好的起点。 因为您说过您想自己去冒险,所以我不会发布代码;-)

我对正则表达式无能为力,该代码string pattern = @"=(?<after>\\w+)"; 是在等号=后匹配单词,最好是有些专家以更好的方式展示:D

      string txtBatFile= "<physical path for batfile>";
        if (File.Exists(txtBatFile))
        {
                 StreamReader SR = new StreamReader(txtBatFile);
                 string strFileText= SR.ReadToEnd();
                 SR.Close();
                 SR.Dispose();

        string pattern = @"=(?<after>\w+)";        

      MatchCollection matches = Regex.Matches(strFileText, pattern, RegexOptions.Multiline | RegexOptions.IgnoreCase);

        ArrayList _strList = new ArrayList();
        foreach (Match match in matches)
       {
        _strList.Add(match.Groups["after"].ToString());
       }

        Textbox1.Text = _strList[0].ToString();
        Textbox2.Text = _strList[1].ToString();
        Textbox3.Text = _strList[2].ToString();
        Textbox4.Text = _strList[3].ToString();
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM