![]() |
|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 28.03.2009
Сообщений: 18
|
![]()
Помогите составить макрос для Excel 2003-2007, который будет читать информацию в виде группы абзацев из огромного текстового файла "Образец базы.txt" в кодировке 1251, удалять знаки абзаца и пробелы в конце и в начале группы, заменять остальные знаки перевода строки на символы типа "^n", и вставлять полученную информацию в соответствующую ячейку, напротив ячейки с идентификатором. Идентификаторы в файл Excel уже считаны и распределены по нужным ячейкам. Если нужной информации нет - вставлять строку типа "Not found".
Информация в каждой группе текста разделена маркерами вида "#НАЧАЛО#" и "#КОНЕЦ#". Пример исходного и того, что должно получиться: |
![]() |
![]() |
![]() |
#2 | ||
Новичок
СтарожилДжуниор
Регистрация: 05.02.2008
Сообщений: 9,487
|
![]()
я бы рекомендовал:
Цитата:
Цитата:
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
|
||
![]() |
![]() |
![]() |
#3 |
Регистрация: 18.08.2014
Сообщений: 7
|
![]()
Исхожу из предположения, что индентификаторы были считаны из этого же текстового файла.
Импортирую файл в эксель, используя в качестве разделителя #, от левой верхней ячейки пустого листа. В этом же листе: Код:
P.S. Я рад бы избавиться от кучи невнятных переменных и уродских вложенных циклов, но не знаю, как. Последний раз редактировалось n_lomov; 14.10.2014 в 02:19. |
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 02.05.2009
Сообщений: 3,907
|
![]()
Можно так.
Поменяйте путь к текстовику на ваш.
Анализ,обработка данных Недорого
|
![]() |
![]() |
![]() |
#5 |
Пользователь
Регистрация: 28.03.2009
Сообщений: 18
|
![]()
n_lomov, спасибо за труд. Однако, к сожалению, макрос у меня в данном виде не работает.
Во-первых, он разбирает только первую запись и останавливается, возможно потому, что в операторе Do While i <= ActiveSheet.UsedRange.Rows.Count "ActiveSheet.UsedRange.Rows.Cou nt" всегда равно 1 (на excel 2003). Кроме того, даже если явно указать количество строк на листе (Do While i <= 100000), макрос вылетает с ошибкой "400" на второй же записи на операторе Cells(d, ID) = Cells(d, ID) & NovStr & Cells(j, 1) Во-вторых, он не убирает пробелы и знаки новой строки в начале и в конце каждой записи. Не критично, но нужно. И последнее, главное, он не распределяет записи согласно имеющимся идентификаторам, а строит сам этот список идентификаторов. Это, конечно, бывает полезно, но не в данном случае. Может быть, макрос можно доработать? ----------------------------------------------- doober, cпасибо за макрос, но он тоже не работает. Проблемы такие. Разобрав часть базы он вылетает с ошибкой "Out of memory", например на операторе Sh.Cells(XX.Row, 8) = RR хотя это наверно не важно. У меня 2 Гб ОЗУ. Кроме того, он удаляет знаки новой строки (т.е. пустые строки) в середине каждой записи, а должен только в начале и в конце записи. А в середине, из-за ограничений Excel, заменять на что-либо, например на строку "^N^" или подобную. Также он уничтожает все символы вертикальной черты "|", которые встречаются в базе, хотя этого делать не надо. И последнее, строки в Excel получаются огромной высоты, листать такой файл практически невозможно. Можно ли макрос исправить? |
![]() |
![]() |
![]() |
#6 |
Старожил
Регистрация: 02.05.2009
Сообщений: 3,907
|
![]()
Все можно.
На файлообменник текстовый файл,исходный файл excel для заполнения(состояние перед выполнением макроса),и дальше будем посмотреть. Если у вас файл больше 30 метров,конечно надо использовать другой алгоритм
Анализ,обработка данных Недорого
|
![]() |
![]() |
![]() |
#7 |
Пользователь
Регистрация: 28.03.2009
Сообщений: 18
|
![]()
n_lomov, проведя дополнительные эксперименты, я выяснил, что был не совсем прав - макрос может работать так, как вы говорите, но только его нужно запускать с активного листа, а не с любого, и нельзя править что-либо на листе. Тогда вроде бы правильно определяется количество строк в операторе
While i <= ActiveSheet.UsedRange.Rows.Count Но мне кажется, что более надежно было бы что-то такое: Dim LastRow As Long LastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1 Do While i <= LastRow Также выяснились 2 причины, по которым ваш макрос вылетал: - если строка в базе начинается со знака равно "=", макрос вылетает; - при предварительном импорте текстового файла по непонятным причинам некоторые строки импоритруются с ошибкой, причину я не нашел, но особенно часто, когда строки начинаются с дефиса "-", например строка "- строка один" импортируется как "=- строка один" и снова макрос вылетает. Если бы вы смогли устранить эти проблемы макрос был бы полезен, хотя и не для этой конкретной задачи. Также очень неудобно импортировать файл вручную. Может Вы могли бы добавить в свой макрос что-то такое: Const BaseFileName As String = "Образец базы.txt" 'имя файла базы Const DirName As String = "C:\tmp\" 'папка файла базы Const IDChar As String = "#" 'разграничитель 'перейти в первую ячейку и считать файл Range("A1").Select Workbooks.OpenText Filename:=DirName & BaseFileName, Origin:=1251, _ StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlNone, _ ConsecutiveDelimiter:=True, Tab:=False, Semicolon:=False, Comma:=False, _ Space:=False, Other:=True, OtherChar:=IDChar, FieldInfo:=Array(Array(1, 1), _ Array(2, 1)), TrailingMinusNumbers:=True PS Я сейчас пытаюсь сгенерировать образец базы размером хотя бы пару метров, чтобы те, кто помогает мне, могли более реально оценить работу макросов. |
![]() |
![]() |
![]() |
#8 |
Регистрация: 18.08.2014
Сообщений: 7
|
![]()
Почему из-за знака = вылетает, не могу сказать. А импортировать можно следующим образом:
Код:
|
![]() |
![]() |
![]() |
#9 |
Старожил
Регистрация: 11.05.2010
Сообщений: 5,166
|
![]()
Чтоб не вылетало на "=" - ставьте Сперва ячейке текствый формат, или так: "'=..."
webmoney: E265281470651 Z422237915069 R418926282008
|
![]() |
![]() |
![]() |
#10 |
Пользователь
Регистрация: 28.03.2009
Сообщений: 18
|
![]()
n_lomov, ваш код для импорта файла работает без проблем, спасибо. Теперь бы перенести нужные ячейки в соответствующее место на новый или текущий лист...
Hugo121, я не совсем понимаю, перед экспортом вставить оператор Код:
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Импорт Большого текстового файла (14 млн. строк) с разбиением | strannick | Microsoft Office Excel | 15 | 01.02.2014 12:55 |
Есть ли способ вставлять кнопки в ячейки таблицы? | Serhantes | Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) | 0 | 27.02.2013 13:54 |
Обработка большого текстового файла и составление по нему отчета | erosss | Помощь студентам | 6 | 05.05.2010 13:18 |
нужно читать слова с текстового файла | artush1984 | Общие вопросы C/C++ | 1 | 18.09.2009 16:12 |
Вставлять ячейки через поля слияния | Nash1 | Фриланс | 3 | 09.07.2009 14:07 |