Выделите столбцы, которые отличаются от предыдущих строк - PullRequest
1 голос
/ 16 сентября 2011

У меня есть текстовый файл с числовыми данными, записанными в строках; есть чередующиеся входные линии (неизвестные) и строки остатков (которые должны быть сведены к минимуму). Я исследую способы, как итеративный решатель обрабатывает различные случаи, и хотел бы выделить каждое (разделенное пробелами) поле в строке остатков, которое (текстуально) отличается от того же поля в предыдущей строке остатков (2 строки выше, лучше регулярным выражением). Я могу свободно украшать начало строк, как мне нравится, если это поможет.

Возможно ли это вообще с помощью Vim и некоторой магии регулярных выражений?

Файл примера:

input 1 2 3 4 5 6
errors .2 .2 .3 .1 0 0
input 1 2.1 2.9 4 5 6    ## here, 2.1 and 2.9 should be highlighted
errors .21 .3 .44 .3 0 0
input 1 2 3 3.9 5.2 6    ## here, 2, 3, 3.9 and 5.2 should be highlighted
errors .2 .2 .34 .9 1 0

Примечание: я мог бы написать скрипт, извлекающий различия в Python, но я хочу взглянуть как на фактические данные, так и на изменения. Когда он не работает с Vim, я буду обрабатывать его с помощью Python и выводить выделенный HTML, но я потеряю возможности автоматического сворачивания.

1 Ответ

0 голосов
/ 16 сентября 2011

Я думаю , что если вы используете для сравнения массивы, а не регулярные выражения, это может быть намного проще:

<?php
$lastRow=array()
$h=fopen('file','r');
while ($r=fgetcsv($h,0,' ')) // Retrieve a line into an array and split on spaces
{
    if (count($lastRow)==0)
    {
        $lastRow=$r; // Store last line
    }

    $count++;

    if ($r[0]=='input')
    {
        /*
         * this won't find any differences the first run through
         */
        $diffs=array_diff($lastRow,$r); // Anything that has changed from the last "input" line is now in $diffs
        $lastRow=$r; // Only copy into $lastRow if it's an "input" line
    }
    /*
     *  Put your code to output line here with relevant CSS for highlighting
     */
}
fclose($h);

?>

Я не тестировал этот код, но думаю, что он показывает, как вы можете получить решение, не углубляясь в регулярные выражения

...