Скрипт для исправления ломаных в файле .txt? - PullRequest
2 голосов
/ 09 июня 2010

Мне бы хотелось, чтобы я правильно читал книги на Kindle.

Чтобы осуществить свою мечту, мне нужен скрипт для исправления ломаных линий в текстовом файле.

Например, еслиTXT-файл имеет следующую строку:

He watched Kahlan as she walked with her shoulders slumped
down.

... тогда он должен исправить это, удалив символ новой строки перед словом "down":

He watched Kahlan as she walked with her shoulders slumped down.

Итак, коллеги-программисты, что(а) самый простой способ сделать это и (б) лучший язык?

ps Решение будет включать в себя поиск строчной буквы в столбце 1 и удаление новой строки перед ней, чтобы прошить строкивсе вместе.В романе, который я пытаюсь исправить, есть 1,2 миллиона случаев этого "разбойного разрыва линии".

Ответы [ 7 ]

2 голосов
/ 09 июня 2010

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

Например, это будет делать то, что вы просили:

# Slurp entire file.
# Convert newlines followed by lower-case letter.
perl -p -e 'BEGIN {$/ = undef}    s/\n(?=[a-z])/ /g' book.txt

Но это, вероятно, лучше, если абзацы разделены двумя символами новой строки.

# Process file a "paragraph" at a time.
# Convert newlines followed by at least 2 characters.
perl -p -e 'BEGIN {$/ = qq{\n\n}} s/\n(?=..)/ /g'    book.txt
1 голос
/ 09 июня 2010

Если между абзацами есть пробелы: прочитайте текст по абзацам (установите $/ = "\n\n"'), а затем используйте Text :: Autoformat из CPAN.

Пример (замените обычный дескриптор файладля ДАННЫХ - я использовал это только для удобства в примере):

use strict;
use warnings;
use Text::Autoformat;

local $/ = "\n\n";
while (<DATA>) {
    print autoformat $_, {left=>1, right=>80};
}


__DATA__
He watched Kahlan as she walked with her shoulders slumped 
down. 

He watched Kahlan as she walked with her shoulders slumped 
down. 
He watched Kahlan as she walked with her shoulders slumped 
down. 
He watched Kahlan as she walked with her shoulders slumped 
down. 

He watched Kahlan as she walked with her shoulders slumped 
down. 
He watched Kahlan as she walked with her shoulders slumped 
down. 

Вывод:

He watched Kahlan as she walked with her shoulders slumped down.

He watched Kahlan as she walked with her shoulders slumped down. He watched
Kahlan as she walked with her shoulders slumped down. He watched Kahlan as she
walked with her shoulders slumped down.

He watched Kahlan as she walked with her shoulders slumped down. He watched
Kahlan as she walked with her shoulders slumped down.
0 голосов
/ 10 июня 2010

Откройте файл с помощью vim, :set tw=0 noai, затем gggqG. Если файл достаточно хорошо себя ведет, это должно убрать все разрывы строк в абзацах, сохраняя при этом разрывы абзацев.

0 голосов
/ 09 июня 2010

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

Если нет, вы можете уничтожить все новые строки, которые не находятся в последовательности 2 или более новых строк.

Вы также можете уничтожить все символы новой строки, которые не следуют за точкой, но, как уже было отмечено, это потерпит неудачу в случае, если предложение заканчивается строкой, но не абзацем.

0 голосов
/ 09 июня 2010

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

Вот реализация C #;

    string UnwrapText(string input)
    {
        return Regex.Replace(input, Environment.NewLine + "[a-z]",
                            delegate(Match m)
                            {
                                return m.ToString().Replace(Environment.NewLine, " ");
                            });
    }
0 голосов
/ 09 июня 2010

Я бы сказал, проанализировать книгу и искать вхождения символа новой строки.Если оно не наступит через какое-то время, удалите его.Единственная проблема заключается в том, что в данном конкретном случае это не сработает:

Он смотрел, как Кэлен, когда она шла, опустив плечи. \ N

Он смотрел, как Кэлан гулялас опущенными плечами.

Вместо:

Он смотрел, как Кэлен идет, опустив плечи.Он смотрел, как Кэлен идет, опустив плечи.

В этом случае вам придется определить, как разделены абзацы (это два символа новой строки?).Если это так, проверьте по прошествии периода, есть ли два символа новой строки.Если нет, то удалите первый символ новой строки.

0 голосов
/ 09 июня 2010

Если между абзацами есть новые строки, вы можете просто открыть их в хорошем текстовом редакторе, в котором есть опция «развернуть текст». Одним из таких является TextMate для Mac, но, возможно, есть варианты и для Windows.

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