Вырезать общие строки из нескольких файлов и вставить их в другой файл - PullRequest
1 голос
/ 20 июня 2011

Допустим, у меня есть 5 файлов: f1, f2, f3, f4, f5.Как я могу удалить общие строки (одинаковый текст во всех файлах) из всех 5 файлов и поместить их в 6-й файл, f6?Пожалуйста, дайте мне знать.

Формат файлов:

property.a.p1=some string
property.b.p2=some string2
          .
          .
          .
property.zzz.p4=123455

Так что если вышеприведенный фрагмент является выдержкой из файла 1 и файлы 2-5 также имеют строкуproperty.a.p1=some string, затем я хотел бы удалить эту строку из файлов 1–5 и поместить ее в файл 6. Каждая строка каждого файла находится на новой строке.Таким образом, я буду сравнивать каждую строку на новой строке один за другим.Каждый файл содержит от 400 до 600 строк.

Я нашел это на форуме для удаления общих строк из двух файлов с помощью ruby: $ ruby -ne 'BEGIN {a=File.read("file1").split(/\n+/)}; print $_ if a.include?($_.chomp)' file2

Ответы [ 2 ]

2 голосов
/ 21 июня 2011

Посмотрите, делает ли это то, что вы хотите.Это двухпроходное решение: первый проход использует хеш-таблицу для поиска общих строк, а второй использует ее для фильтрации любых строк, которые совпадают с общими.

$files = gci "file1.txt","file2.txt","file3.txt","file4.txt","file5.txt"

$hash = @{}
$common = new-object system.collections.arraylist

foreach ($file in $files) {
 get-content $file | foreach {
 $hash[$_] ++
 }
}

$hash.keys |% {
 if ($hash[$_] -eq 5){[void]$common.add($_)}
}


$common | out-file common.txt

[regex]$common_regex = ‘^(‘ + (($common |foreach {[regex]::escape($_)}) –join “|”) + ‘)$’

foreach ($file in $files) {
 $new_file = get-content $file |? {$_ -notmatch $common_regex}
 $new_file | out-file "new_$($file.name)"
}
0 голосов
/ 20 июня 2011

Создайте таблицу в базе данных SQL следующим образом:

create table properties (
    file_name  varchar(100) not null,  -- Or whatever sizes make sense
    prop_name  varchar(100) not null,
    prop_value varchar(100) not null
)

Затем проанализируйте ваши файлы с помощью простых регулярных выражений или даже просто split:

prop_name, prop_value = line.strip.split('=')

сбросьте проанализированные данные в вашу таблицу и сделайте немного SQL, чтобы найти свойства, общие для всех файлов:

select prop_name, prop_value
from properties
group by prop_name, prop_value
having count(*) = $n

Где $n заменяется количеством входных файлов. Теперь у вас есть список всех общих свойств и их значений, поэтому запишите их в новый файл, удалите их из таблицы properties, затем прокрутите все строки, оставшиеся в properties, и запишите их в соответствующие файлы (то есть файл с именем в столбце file_name).

Вы говорите, что файлы "огромные", так что вы, вероятно, не хотите, чтобы все они одновременно хранились в памяти. Вы могли бы сделать несколько проходов и использовать библиотеку хэширования на диске для отслеживания того, что было замечено и где, но это было бы пустой тратой времени, если у вас есть база данных SQL, и у каждого должен быть, по крайней мере, SQLite, работающий вокруг , SQL и базы данных предназначены для управления большими объемами структурированных данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...