Самый простой метод сценариев для объединения двух текстовых файлов - Ruby, Python, JavaScript, Java? - PullRequest
2 голосов
/ 18 декабря 2010

У меня есть два текстовых файла, один из которых содержит HTML, а другой содержит слагы URL:

ФАЙЛ 1 (HTML):

<li><a href="/article/"><button class="showarticle"/><span class="author">Thomas Friedman</span> - <span class="title">The World Is Flat</span></a></li>
<li><a href="/article/"><button class="showarticle"/><span class="author">Michael Dagleish</span> - <span class="title">Scotland In Wartime</span></a></li>
<li><a href="/article/"><button class="showarticle"/><span class="author">Dr. Raymond Kinsella</span> - <span class="title">Progress In Cancer Treatments</span></a></li>
...

ФАЙЛ2 (URL SLUGS):

thomas-friedman-the-world-is-flat
michael-dagleish-scotland-in-wartime
dr-raymond-kinsella-progress-in-cancer-treatments
...

Мне нужно объединить их так, чтобы слагы из ФАЙЛА 2 были вставлены в HTML-код ФАЙЛА 1 следующим образом:

РЕЗУЛЬТАТ:

<li><a href="/article/thomas-friedman-the-world-is-flat"><button class="showarticle"/><span class="author">Thomas Friedman</span> - <span class="title">The World Is Flat</span></a></li>
<li><a href="/article/michael-dagleish-scotland-in-wartime"><button class="showarticle"/><span class="author">Michael Dagleish</span> - <span class="title">Scotland In Wartime</span></a></li>
<li><a href="/article/dr-raymond-kinsella-progress-in-cancer-treatments"><button class="showarticle"/><span class="author">Dr. Raymond Kinsella</span> - <span class="title">Progress In Cancer Treatments</span></a></li>

Какой наилучший подход и какой язык будет наиболее подходящим для выполнения этой задачи с минимальной сложностью?

Ответы [ 6 ]

6 голосов
/ 18 декабря 2010

Вам нужна zip-функция, которая доступна на большинстве языков.Его целью является параллельная обработка двух или более массивов.
В Ruby это будет примерно так:

f1 = File.readlines('file1.txt')
f2 = File.readlines('file2.txt')

File.open('file3.txt','w') do |output_file|

    f1.zip(f2) do |a,b|
        output_file.puts a.sub('/article/','/article/'+b)
    end

end

Для архивирования более двух массивов, которые вы можете сделать f1.zip(f2,f3,...) do |a,b,c,...|

2 голосов
/ 30 октября 2015

Рубиновый лайнер:

File.open("joined.txt","w") { |f| f.puts ['file1.txt', 'file2.txt'].map{ |s| IO.read(s) }}
2 голосов
/ 18 декабря 2010

Это будет легко на любом языке. Здесь это в псевдо-Python; Я опустил биты lxml, потому что у меня нет доступа к ним, и я не могу вспомнить синтаксис. Хотя они не сложны.

with open(...) as htmls, open(...) as slugs, open(...) as output:
    for html, slug in zip(htmls, slugs):
        root = lxml.etree.fromstring(html)
        # do some fiddling with lxml to get the name

        slug = slug.split("-")[(len(name.split()):]
        # add in the extra child in lxml

        output.write(root.tostring())

Интересные функции:

  • Это не читает весь файл сразу; он делает это порциями (ну, построчно, но Python будет буферизовать его). Полезно, если файлы огромны, но, вероятно, не имеют значения.

  • lxml может быть излишним, в зависимости от того, насколько жестким является формат HTML-строк. Если они гарантированно одинаковы и все правильно сформированы, вам будет проще использовать простые строковые операции. С другой стороны, lxml довольно быстр и предлагает гораздо больше гибкости.

1 голос
/ 04 апреля 2012

Python - отличный язык. Просто посмотрите на эти шесть строк Python, они могут объединить любой большой текстовый файл, только сейчас я объединил 2 текстовых файла по 10 ГБ каждая.

1 голос
/ 18 декабря 2010

Самый простой способ сделать это - использовать язык из перечисленных, который вам наиболее знаком.Даже если это не даст наилучшего решения, работа будет выполнена с наименьшими (умственными) усилиями.

Если вы не знаете ни одного из них, тогда Perl - хороший вариант, посколькувещей, для которых он был разработан.(Я предполагаю, что вы понимаете регулярные выражения ...) И, судя по некоторым другим ответам, Python также является хорошим вариантом.

0 голосов
/ 18 декабря 2010

PHP самый простой!

$firstFile = file('file1.txt');
$secodFile = file('file2.txt');

$findKey='/article/';
$output='';

if (count($firstFile)==count($secodFile)) 
                    or die('record counts dont match');

for($i=0;$i<count($firstFile);$i++)
{
    $output.=str_replace($findKey,$findKey.trim($secodFile[$i]),$firstFile[$i]);
}

file_put_contents('output.txt',$output);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...