Замена значений в середине строки - PullRequest
0 голосов
/ 27 июля 2011

ОБЪЯСНЕНИЕ КОДА НИЖЕ:

  • Я загружаю файл .txt и создаю список для его сохранения.
  • Цикл while сохраняет весь текств список.
  • Я создаю еще 3 списка для хранения различных значений.
  • Я использую REGEX для сопоставления для чисел, похожих на "111.111".
  • Если это совпадениев строке сгруппируйте его как «X» и «Y».
  • Добавьте каждый из сгруппированных элементов в новые списки, созданные выше (их 3).
  • Используйте дополнение наЗначения «X» и «Y» с использованием входного значения TextBox.
  • Вывести значения StringBuilder в RichTextBoxes.

    private void calculateXAndYPlacement()
    {s
        // Reads the lines in the file to format.
        var fileReader = File.OpenText(filePath + "\\Calculating X,Y File.txt");
    
        // Creates a list for the lines to be stored in.
        var fileList = new List<string>();
    
        // Adds each line in the file to the list.
        var fileLines = "";                                       #UPDATED @Corey Ogburn
        while ((fileLines = fileReader.ReadLine()) != null)       #UPDATED @Corey Ogburn
            fileList.Add(fileLines);                              #UPDATED @Corey Ogburn
    
        // Creates new lists to hold certain matches for each list.
        var xyResult = new List<string>();
        var xResult = new List<string>();
        var yResult = new List<string>();
    
        // Iterate over each line in the file and extract the x and y values
        fileList.ForEach(line =>
        {
            Match xyMatch = Regex.Match(line, @"(?<x>-?\d+\.\d+)\s+(?<y>-?\d+\.\d+)");
            if (xyMatch.Success)
            {
                // Grab the x and y values from the regular expression match
                String xValue = xyMatch.Groups["x"].Value;
                String yValue = xyMatch.Groups["y"].Value;
    
                // Add these two values, separated by a space, to the "xyResult" list.
                xyResult.Add(String.Join(" ", new[]{ xValue, yValue }));
    
                // Add the results to the lists.
                xResult.Add(xValue);
                yResult.Add(yValue);
    
                // Calculate the X & Y values (including the x & y displacements)
                double doubleX = double.Parse(xValue);
                double doubleXValue = double.Parse(xDisplacementTextBox.Text);
                StringBuilder sbX = new StringBuilder();
    
                sbX.AppendLine((doubleX + doubleXValue).ToString());
    
                double doubleY = double.Parse(yValue);
                double doubleYValue = double.Parse(yDisplacementTextBox.Text);
                StringBuilder sbY = new StringBuilder();
    
                sbY.AppendLine((doubleY + doubleYValue).ToString());
    
                calculatedXRichTextBox.AppendText(sbX + "\n");
                calculatedYRichTextBox.AppendText(sbY + "\n");
            }
        });
    }
    

СЕЙЧАС ::: То, что я пытаюсь сделать, это взять эти новые значения, которые есть в calculatedXRichTextBox, calculatedYRichTextBox и Заменить старые значения (в fileList) и вывод их для переопределения calculatedXRichTextBox и calculatedYRichTextBox.

SO, у меня есть следующие значения:

(исходный файл)

TEXT   TEXT  227.905  203.244  180  
TEXT   TEXT  242.210  181.294  180  
TEXT   TEXT  236.135  198.644  90  

(вырезанные значения "X"и "Y" - в 2 разных списках)

227.905                      203.244  
242.210                      181.294  
236.135                      198.644  

(вычисленное значение прибавляет "10" к "X" и "20" к "Y""- поместив их в 2 разные RichTextBoxes)

237.905                      223.244
252.210                      201.294
246.135                      218.644

(ЭТО ТО, ЧТО Я ХОЧУ ЗАКОНЧИТЬ - оригиналфайл + вычисленные значения, заменяющие старые значения)

TEXT   TEXT  237.905  223.244  180  
TEXT   TEXT  252.210  201.294  180  
TEXT   TEXT  246.135  218.644  90  

ВОПРОСЫ:

  • Какя могу это сделать?

Ответы [ 3 ]

1 голос
/ 28 июля 2011

Еще один способ решения вашей проблемы - думать о вашем коде как о применении преобразования к потоку данных.

Это в основном то, что делает приведенный ниже пример.Он был написан для .NET 4.0, если вы ориентируетесь на более раннюю среду выполнения, вам придется использовать метод ReadAllLines (в отличие от ReadLines) и вместо Tuple вам нужно создать контейнерный класс (который может быть закрытым для этого класса), чтобы возвращать несколько значений из вашей функции.

void calculateXAndYPlacement()
{
    // Read data from file
    var path = @"[path to your document]";
    var data = File.ReadLines(path + "data.txt");

    // Parse the values you'll be modifying your data by
    var doubleXValue = double.Parse(xDisplacementTextBox.Text);
    var doubleYValue = double.Parse(yDisplacementTextBox.Text);                     

    // apply your transformation to all valid lines of data
    var modifiedData = from line in data
                       where LineIsValid( line )
                       select ModifyLine( line, doubleXValue, doubleYValue );

    // Do what you wish with the data
    foreach( var dataPoint in modifiedData )
    {
         // grab the values from the Tuple and put them into the
         // appropriate text boxes.
    }
}

Tuple<string,double,double> ModifyLine(string data, double xValue, double yValue)
{
    // split line into parts
    var columns = Regex.Split(data, @"\s+");
    columns.Dump();
    // do your math on each part, I just assigned the new values
    // for the sake of the example.
    columns[3] = xValue.ToString();
    columns[4] = yValue.ToString();

    // recombine the line
    return Tuple.Create( string.Join(" ", columns), xValue, yValue );
}

bool LineIsValid(string lineData)
{
    return Regex.IsMatch(lineData, @"(?<x>-?\d+\.\d+)\s+(?<y>-?\d+\.\d+)");
}
0 голосов
/ 27 июля 2011

Попробуйте строку. Замените, как в этом коде PSEUDO:

int i=0;
while(newline){
   if(patternMatch){
      // replace old values with new ones
      line.Replace(oldXList[i], newXList[i]).Replace(oldYList[i], newYList[i]);
      i++;
   }
}

Это не очень элегантно, но должно работать, не так ли?

0 голосов
/ 27 июля 2011

Ну, так как вы уже используете Regex, чтобы соответствовать вашим значениям, почему вы не пытаетесь использовать Regex.Replace, чтобы изменить их.

Смотрите эту ссылку для получения дополнительной информации ...

http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.replace(v=vs.71).aspx

...