2015-03-18 3 views
0

Я хочу прочитать определенные данные из файла bat (заданные значения), а затем записать их в Textbox1.Text (это первые строки файла, который я хочу прочитать), и я хочу получить значенияЧтение определенных данных из файла

ХХХХХ запись в 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#, я еще не знаком с ним, поэтому, если бы вы могли объяснить мне, а не только предоставить код, я был бы благодарен :)

EDIT: на самом деле это не так уж мало, весь файл битой так: http://wklej.to/sCQ6i (я знаю, что летучая мышь файл удалить файл журнала в конце, но я буду обрабатывать его)

И 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

+0

Просьба поделиться образцом кода и файлом входных данных. Я думаю, вы не знаете о рекомендациях по использованию этого форума. – Karan

+0

Почему бы не сериализовать и де-сериализовать свои данные на объект и из него? Делает это проще на многих уровнях. Кроме того, вам нужно открыть файл, прочитать его все, изменить то, что вы хотите, а затем записать его обратно в файл. Еще один намек ... взгляните на класс FileStream в пространстве имен System.IO .... –

+1

@Karan: Я думаю, вы не знаете, что это не форум;) –

ответ

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 события, но другую кнопку, в противном случае событие вызываются при любом изменении, которое вызывает нежелательные эффекты.

+0

Плюс один. Я не знаю, как заменить и переписать отредактированную строку в файл. Ваш ответ уточняет :) – zey

+0

@zey: возникла ошибка, трудно найти соответствующий индекс, поскольку это не индекс строки в файле, а «match-index». Теперь он должен работать, хотя я не люблю использовать локальную переменную в запросе LINQ. Если у кого-то есть лучшая идея, я был бы очень рад услышать его (конечно, возможно, простой цикл). –

0

Вы можете использовать System.IO.File-class и его статические методы для чтения данных из файла. Особенно полезен метод ReadAllLines. Таким образом, вы можете перебирать строки или использовать индекс для адреса. foreach и для Петли должны работать. String-class дает вам инструменты для деконструирования прочитанных данных, подумайте об использовании методов Сплит или IndexOf. Запись данных обратно в файл также может быть выполнена с использованием System.IO.File -класс. Самый простой способ - переписать полный файл со всеми вашими значениями, так как количество данных довольно низкое. Рассмотрим использование AppendLine -Метод от System.IO.File -класс.

Данные MSDN-Links должны дать вам хорошую отправную точку для ваших исследований. Я не буду публиковать код, так как вы сказали, что хотите отправиться в приключение для себя ;-)

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(); 
     } 
+0

ваш код берет слово с "=", например "= XXXXX" не только "XXXXX" –

Смежные вопросы