Объединить содержимое файлов построчно (перемежать строки)

Я использую Windows 10 и InDesign CS6. Я хотел бы взять 2 файла, смешать содержимое построчно и вывести в третий файл, чтобы сделать электронную книгу, как показано ниже.

ВХОДНОЙ ФАЙЛ 1 (например, TXT, XML, SQL и т. д.)

[Этот файл уже находится в построчном формате — каждая строка разграничена символом возврата.]

линия 1

строка 2

строка 3

и т. д.

ВХОДНОЙ ФАЙЛ 2 (INDD)

[Этот файл имеет форму плавного текста, и каждая строка должна быть разграничена, например, 1 строка = каждая текстовая строка, начинающаяся с заглавной буквы и заканчивающаяся «точкой + пробел».]

строка А [сноска 1]

строка B [сноска 2]

строка C [сноска 3]

и т. д.

ВЫХОДНОЙ ФАЙЛ 3 (например, EPUB, HTML, XML и т. д.)

линия 1

строка А [сноска 1]

строка 2

строка B [сноска 2]

строка 3

строка C [сноска 3]

и т. д.

Я нашел несколько соответствующих дискуссий здесь и здесь (суть в том, что в системах *nix есть функция вставки, в Excel есть функция гармошки, и был предложен метод в командной строке DOS и некоторые другие методы сценариев). Боюсь, эти обсуждения для меня немного загадочны и не помогают полностью в моей ситуации. Я разбираюсь в компьютерах, но у меня нет опыта программирования, поэтому я ищу здесь помощь, чтобы показать мне путь и начать работу.

Буду признателен за любые предложения относительно практического рабочего процесса (его не нужно полностью автоматизировать). Я также хотел бы выяснить, был ли Входной файл 1, скажем, файлом DOC или INDD с плавным текстом без разграничения. Было бы неплохо иметь некоторую гибкость в рабочем процессе.

Это будет непросто — в такого рода обработке так много неизвестных и подводных камней, что наиболее важно (насколько я могу думать): вы уверены, что в обоих файлах всегда будет одинаковое количество строк? Вы уверены , что все строки в файле 2 всегда могут быть разграничены таким образом (что произойдет, если строка содержит что-то вроде «например, Microsoft»)? Входные файлы настолько длинные, что ручное разделение файла 2 на строки непозволительно? Если вы можете обеспечить точную демаркацию и одинаковое количество строк, это не должно быть слишком сложно реализовать.
Тем не менее, это все равно потребует написания разумного сложного сценария InDesign. JavaScript, вероятно, самый простой и популярный из поддерживаемых языков.
@JanusBahsJacquet я не называю сценарий сложным
@joojaa Это зависит от того, сколько он должен делать и насколько он должен быть автоматизирован. Если вам нужно открыть файлы без текста в документе (т. е. выбрать входные файлы в подсказке), затем добавить содержимое в документ и оформить его в соответствии с правилами, не указанными здесь, а затем экспортировать документ как полный ePub, который в моем мире считался бы достаточно сложным сценарием для того, у кого практически нет опыта программирования.
@JanusBahsJacquet, конечно, но тогда вы всегда можете защитить себя тем, что все в мире не стоит делать, потому что это можно сделать лучше. Лучшее — враг готового!
@joojaa Моя точка зрения заключалась в том, что из вопроса неясно, какая часть этого процесса должна быть автоматизирована, а какая будет выполняться вручную. Если просто получить строки в правильном порядке — это единственное, что нужно автоматизировать, то это довольно просто (хотя разделение строк во втором файле все еще может быть сложным — мы не знаем, сколько здесь предостережений); если все это нужно автоматизировать, это более сложно.
@JanusBahsJacquet, конечно, но тогда, начиная с ничего, мы не можем предположить, что БОЛЬШИНСТВО из этого не должно быть автоматизировано. Потому что большинство людей не понимают автоматизацию, поэтому они думают, что маленькие шаги — это автоматизация. Я имею в виду, что, скорее всего, 25% всех людей, работающих в InDesign, полностью заменяются сценарием, просто они не знают, где найти человека, который это сделает. Но тогда лицензия inDesign запрещает вам это делать (система не просто текст в лицензии). Для этого вам потребуется серверная лицензия.
Спасибо за ваш вклад. Я отредактировал «хороший рабочий процесс» в исходном вопросе, чтобы прочитать «достаточно практичный рабочий процесс ... (его не нужно полностью автоматизировать)».
Я понимаю, что это все еще открыто для интерпретации, но я доволен этим, потому что я открыт для предложений. Важно отметить, что это не теоретический вопрос о том, можно ли автоматизировать весь рабочий процесс публикации, поскольку предполагается, что это возможно . Это вопрос о том, что целесообразно делать в большинстве случаев публикации. Большинство людей будут рады вручную открыть программу, дважды щелкнуть по сценарию, экспортировать в ePub и т. д.

Ответы (2)

Да, немного жаль, что навыки компьютерной грамотности людей в целом так же низки, как и у вас. Но это нормально я полагаю. Я бы сделал это с помощью своего текстового редактора или sed , но это только я. Предложенный ответ весьма однозначен. Но давайте сделаем это в inDesign.

  1. Запустите inDesign и откройте новый документ (и ничего больше)
  2. Импортировать
    1. содержимое ФАЙЛА 1 в один текстовый фрейм
    2. содержимое ФАЙЛА 2 содержимого в другой текстовый фрейм
  3. Запустите ExtendScript Toolkit (если у вас установлено какое-либо программное обеспечение Adobe, оно будет установлено).

    1. Выберите «Файл» -> «Новый JavaScript».
    2. вставьте в документ следующее:

      #target indesign
      var doc = app.activeDocument;
      var text1 = doc.pages[0].textFrames[1].parentStory;
      var text2 = doc.pages[0].textFrames[0].parentStory;
      
      for(var p = text2.paragraphs.length-1; p >= 0 ; p--){
          text1.paragraphs[p].contents += text2.paragraphs[p].contents;
      }
      
    3. Нажмите стрелку с надписью «начать работу ...», чтобы выполнить

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

На что следует обратить внимание, АБСОЛЮТНО должно быть соответствие между строками 1: 1, иначе это не удастся. Также не используйте этот скрипт ни в какой другой среде, кроме нового документа, состоящего всего из 2 фреймов.

Спасибо. Обеспечение соответствия 1:1 не является проблемой, например, для переводов, где мы ожидаем этого. Возьмем стихотворение вроде « Одиссеи» Гомера , в котором 12 110 греческих строк. Естественно, в английском переводе тоже будет 12 110 строк. Проблема с предлагаемым решением заключается в том, что они не все поместятся в 1 текстовом фрейме на 1 странице, поэтому я надеюсь, что с переплетением текстовых фреймов все в порядке. Кроме того, вы сказали, что можно пойти гораздо дальше, так как же указать начало и конец каждой строки, например, начать с заглавной буквы и закончить точкой или номером строки? Будут ли включены сноски?
@AdAstm не имеет значения для сценария, он работает на уровне истории, единственная причина, по которой мне нужно, чтобы у вас было 2 кадра на первой странице, - это просто то, что я могу найти дескрипторы для историй. Сами по себе славы не имеют значения, кроме этого. После того, как они объединены, вы можете делать с ними все, что захотите.
Я запустил скрипт с разными начальными точками и обнаружил следующее: ∙ документ InDesign должен иметь 1 страницу · Кадр 1 – это первый кадр, который нужно нарисовать независимо от его положения относительно второго кадра · сценарий берет строки из Кадр 2 и вставляет их между строками Кадра 1, начиная с последней строки · форматирование строк Кадра 1 сохраняется. Все форматирование строк кадра 2 теряется из-за форматирования кадра 1 · удаляются все сноски, независимо от того, были ли они в кадре 1 или кадре 2 · работает и для нелатинского текста
Говоря стратегически, о чем был вопрос, я полагаю, что вы думаете, что использование встроенной функции сценария InDesign - это правильный путь, и что JavaScript лучше подходит для этой цели, чем VBScript. Кроме того, сценарий JavaScript должен быть построен на операторе +=.
Сценарий @AdAstm VB хорош, но его нельзя переносить между системами, и для его запуска вы должны быть администратором! Если вы не купите лицензию на сервер indesign. В остальном разницы никакой, да и сервер — это просто удороженная копия индизайна. Только если вы должны взаимодействовать с системой в целом. Стратегически вы должны нанять разработчика, который делал это раньше.
В написанном вами сценарии оператор += является ключевым оператором, выполняющим работу. Он делает то, что было задано в вопросе, но за счет удаления форматирования и сносок (последнее упоминается в вопросе). Будет ли ваш сценарий работать лучше, если он будет использовать копирование и вставку?

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

#target indesign
var doc = app.activeDocument;
var text1 = doc.pages[0].textFrames[1].parentStory;
var text2 = doc.pages[0].textFrames[0].parentStory;

for(var p = text2.paragraphs.length-1; p >= 0 ; p--){
    text2.paragraphs[p].move(LocationOptions.AFTER, text1.paragraphs[p]);
}

Итак, ответ на исходный вопрос заключается в том, чтобы подготовить текст INPUT FILE 1 и INPUT FILE 2 в InDesign (два отдельных текстовых фрейма на одной странице), а затем запустить приведенный выше сценарий.