Здравствуйте, уважаемые Знатоки. Внимание вопрос! Проблема: конвертация файла .rtf в excel для последующего анализа. Описание: имеется документы в формате .rtf следующего вида
Данные документа нужно перенести построчно в excel для последующего анализа. Попробовал следующие варианты: 1. Конвертация в .pdf с последующим распознанием Abby FineReader.
Результат: не корректно распознаёт строки.
2. Сохранение в формате .txt; импорт через функцию «Внешние данные» -> «Из текста» -> «С разделителями» «Другой “|”».
Результат: всё отлично переводиться без потери данных, но данные разбиваются по строкам не согласно формальной нумерации строк в столбце «№п/п» (то есть, как мне нужно), а построчно, как в документе; таким образом появляется несколько строк с обрывками данных (см. скриншот ниже).
В итоге, приходиться через формулу СЦЕП объединять все ячейки с данными каждой строки, далее копировать в ту же строку с сохранением исключительно значений. Долго, больно, трудоёмко и метод совершенно дурацкий. Однако, в силу своего скудоумия ничего лучше придумать не смог. Вопроса по существу два: 1. Есть способ перенести данные без потери из .rtf в .xlsx, так чтобы выполнялось главное требование – данные должны переводиться построчно, согласно нумерации столбца «№п/п»? 2. Если первой невозможно, можно ли автоматизировать процесс объединения строк (формула «СЦЕП»), так чтобы все действия выполнял электронный болван, а не мясной. Мясной ленив, хитёр и очень медлен!
Я вижу второй вариант следующим образом:
Вводные: есть данные, полученные с помощью конвертации; диапазон этих данных преобразован в таблицу (см. приложенный пример).
1. По столбцу «№п/п» сверху вниз найти ячейку, в которой содержится значение больше «1». 2. Добавить пустую строку над строкой с найденной ячейкой. 3. Найти значение диапазона строк выше созданной пустой строки до ближайшей ячейки не пустой ячейки (например, в скриншоте ниже для строки 12 это будет диапазон А16:А17).
4. В созданной пустой строке в первой (крайней левой) ячейке ввести формулу СЦЕП с найденным диапазоном. 5. Протянуть формулу по всей ячейкам строки. 6. Скопировать, получившуюся строку. 7. Вставить получившуюся строку туда же – параметры вставки «только значения». 8. Удалить строки сцепленного диапазона (в нашем примере это А16:А17). 9. Повторять операцию вниз до конца таблицы.
Как видите, это ровно та последовательность действий, которая мясным болваном проделываются с помощью рук, мыши, клавиатуры и божие помощи. Основной затруднение, я не знаю, как это формализовать в макрос, особенной затруднение вызывает примерно всё и поиск диапазона. Если есть более разумные способы решения проблемы, буду крайне признателен. Буду крайне признателен знающим людям за помощь с макросом. Файл .rtf и получившийся .xlsx для опытов прилагаю.
Здравствуйте, уважаемые Знатоки. Внимание вопрос! Проблема: конвертация файла .rtf в excel для последующего анализа. Описание: имеется документы в формате .rtf следующего вида
Данные документа нужно перенести построчно в excel для последующего анализа. Попробовал следующие варианты: 1. Конвертация в .pdf с последующим распознанием Abby FineReader.
Результат: не корректно распознаёт строки.
2. Сохранение в формате .txt; импорт через функцию «Внешние данные» -> «Из текста» -> «С разделителями» «Другой “|”».
Результат: всё отлично переводиться без потери данных, но данные разбиваются по строкам не согласно формальной нумерации строк в столбце «№п/п» (то есть, как мне нужно), а построчно, как в документе; таким образом появляется несколько строк с обрывками данных (см. скриншот ниже).
В итоге, приходиться через формулу СЦЕП объединять все ячейки с данными каждой строки, далее копировать в ту же строку с сохранением исключительно значений. Долго, больно, трудоёмко и метод совершенно дурацкий. Однако, в силу своего скудоумия ничего лучше придумать не смог. Вопроса по существу два: 1. Есть способ перенести данные без потери из .rtf в .xlsx, так чтобы выполнялось главное требование – данные должны переводиться построчно, согласно нумерации столбца «№п/п»? 2. Если первой невозможно, можно ли автоматизировать процесс объединения строк (формула «СЦЕП»), так чтобы все действия выполнял электронный болван, а не мясной. Мясной ленив, хитёр и очень медлен!
Я вижу второй вариант следующим образом:
Вводные: есть данные, полученные с помощью конвертации; диапазон этих данных преобразован в таблицу (см. приложенный пример).
1. По столбцу «№п/п» сверху вниз найти ячейку, в которой содержится значение больше «1». 2. Добавить пустую строку над строкой с найденной ячейкой. 3. Найти значение диапазона строк выше созданной пустой строки до ближайшей ячейки не пустой ячейки (например, в скриншоте ниже для строки 12 это будет диапазон А16:А17).
4. В созданной пустой строке в первой (крайней левой) ячейке ввести формулу СЦЕП с найденным диапазоном. 5. Протянуть формулу по всей ячейкам строки. 6. Скопировать, получившуюся строку. 7. Вставить получившуюся строку туда же – параметры вставки «только значения». 8. Удалить строки сцепленного диапазона (в нашем примере это А16:А17). 9. Повторять операцию вниз до конца таблицы.
Как видите, это ровно та последовательность действий, которая мясным болваном проделываются с помощью рук, мыши, клавиатуры и божие помощи. Основной затруднение, я не знаю, как это формализовать в макрос, особенной затруднение вызывает примерно всё и поиск диапазона. Если есть более разумные способы решения проблемы, буду крайне признателен. Буду крайне признателен знающим людям за помощь с макросом. Файл .rtf и получившийся .xlsx для опытов прилагаю.kunnick-maksim
по своему второму варианту - сохраняете txt и далее PQ (он для такого и создан):[vba]
Код
let from = Csv.Document(File.Contents("путь к файлу\8593964.txt"),[Delimiter="|", Columns=12, Encoding=1200]), rem = Table.RemoveColumns(from,{"Column1", "Column7", "Column10","Column12"}), filtr = Table.SelectRows(rem, each Text.Replace([Column8]," ","")<>""), nms = Table.ColumnNames(filtr), f=(x)=>[g=(y)=>Text.Trim(Text.Combine(Table.Column(x,y),"#(lf)")), a=List.Transform(nms,g)][a], group = Table.Group(filtr, "Column2", {"tmp", f},GroupKind.Local,(s,c)=>Number.From(Text.Length(Text.Replace(c," ",""))>0)), to = Table.FromRows(group[tmp],nms) in to
[/vba]
по своему второму варианту - сохраняете txt и далее PQ (он для такого и создан):[vba]
Код
let from = Csv.Document(File.Contents("путь к файлу\8593964.txt"),[Delimiter="|", Columns=12, Encoding=1200]), rem = Table.RemoveColumns(from,{"Column1", "Column7", "Column10","Column12"}), filtr = Table.SelectRows(rem, each Text.Replace([Column8]," ","")<>""), nms = Table.ColumnNames(filtr), f=(x)=>[g=(y)=>Text.Trim(Text.Combine(Table.Column(x,y),"#(lf)")), a=List.Transform(nms,g)][a], group = Table.Group(filtr, "Column2", {"tmp", f},GroupKind.Local,(s,c)=>Number.From(Text.Length(Text.Replace(c," ",""))>0)), to = Table.FromRows(group[tmp],nms) in to