从文件中读取特定数据

时间:2015-03-18 08:35:54

标签: c# 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

3 个答案:

答案 0 :(得分:2)

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

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事件而是另一个按钮,否则会在任何导致不良影响的更改时调用该事件。

答案 1 :(得分:0)

您可以使用System.IO.File-class及其静态方法从文件中读取数据。特别是Method ReadAllLines 应该可以帮到你。因此,您可以遍历行或使用索引来寻址。 foreach for 循环应该有效。 String-class为您提供解构数据读取的工具,考虑使用方法拆分 IndexOf 。 也可以使用 System.IO.File -class将数据写回文件。最简单的方法应该是用所有值覆盖整个文件,因为数据量非常低。考虑使用 System.IO.File -class中的 AppendLine -Method。

给定的MSDN-Links应该为您的研究提供一个良好的起点。我不会发布代码,因为你说你想为自己进行冒险; - )

答案 2 :(得分:0)

我在正则表达式中很弱,这段代码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();
        }