Страницы: 1 2 След.
RSS
[ Закрыто ] Поиск элемента одного массива в другом массиве
 
на лист в столбцы A:A  и B:B импортированы два текстовых файла, представляющих собой отсортированные списки слов. из них формируются 2 массива:arr1 и arr2. требуется найти каждый из элементов второго массива arr2 в первом массиве arr1. 1) если элемент найден - он остается в массиве arr2 на своем месте; 2) если не найден - заменяется каким-нибудь текстом, например "ЯЯЯ". в конце измененный таким образом массив arr2 выгружается, на лист, например в тот же столбец B:B, дальше - сортируется.
1. как загнать текстовый файл в массив без импорта его на лист?
2. как осуществить поиск и замену элементов массива по описанным выше условиям (если можно, пошагово, с комментариями - для полного дилетанта в VBA :) ) :qstn:
 
Ну вы файл-то приложите или мы тут гадать будем за вас?
There is no knowledge that is not power
 
это что, ответ или вопрос?
спасибо, что откликнулись!

файла нет, да и нужен ли он? все просто:
1) один столбец, он же массив arr1:
  1. мама
  2. папа
  3. тетя
  4. дядя
  5. жучка
  6. внучка
2) второй столбец, он же массив arr2:
  1. папа
  2. тапки
  3. туфли
  4. дядя
  5. тетя
3) в результате работы макроса должно получиться arr2:
  1. папа
  2. ЯЯЯ
  3. ЯЯЯ
  4. дядя
  5. тетя
т.е. слова на своих местах, а те, что отсутствуют в arr1 - заменяем на ЯЯЯ
формулы не катят - медленно, нужен макрос с массивами...
 
Цитата
diletant2 написал: как загнать текстовый файл в массив без импорта его на лист?
Так он у Вас уже на листе:
Цитата
diletant2 написал: на лист в столбцы A:A  и B:B импортированы два текстовых файла, представляющих собой отсортированные списки слов.
Код
arr1=range("A1:A5")value
По второму вопросу возможны варианты:
1. Цикл по первому массиву - вложенный цикл по второму. Если не нашли во втором - меняем значение элемента в первом массиве.
2. Цикл по первому массиву - функция листа СчётЕсли (CountIf). Если = 0 - меняем.
 
Юрий М,, спасибо за ответ!

1. ну. сам-то список изначально в текстовом файле. его на лист еще надо взять, хотелось бы без лишних движений - сразу в массив, как?
2. ой, на второй вопрос по поиску и замене - можно по шагам, с комментариями, а?
 
1. Ну если выгрузить на лист, а потом удалить - разве не вариант? Мне кажется, это гораздо проще.
2. Вам лень даже пример нарисовать, а меня просите код, да ещё и с комментариями. Думаете мне не лень? )
 
Юрий М, пример в 3-м комменте, куда еще примеристее? просто щас Ехеля под рукою нету его создавать, а что?
 
Цитата
diletant2 написал: куда еще примеристее?
Цитата
SuperCat написал: Ну вы файл-то приложите
 
Цитата
diletant2 написал: щас Ехеля под рукою нету
Как тогда проверите работу макроса? )
 
Цитата
diletant2 написал: пример в 3-м комменте
Вот сами теперь возьмите, перепишите все это на лист Excel для незнакомого Вам человека, напишите под это код и распишите комментарии. Занятно, неправда? Особенно если учесть, что надо-то это больше всего Вам, а не нам. Никакой интересной задачи в Вашей проблеме нет.
Цитата
diletant2 написал: куда еще примеристее?
В интернете есть справка по всем возможным вариантам циклов по массивам. MSDN называется. Куда еще комментаристее? :)

Вы ленитесь приложить свои файлы TXT и файл Excel. Ни одной строки кода своей не привели для примера. А других просите расписать Вам все по полочкам? Да это какой халтурой попахивает. Надо Вам - а делать должны все другие?
Цитата
diletant2 написал: сам-то список изначально в текстовом файле. его на лист еще надо взять, хотелось бы без лишних движений
А в голову не приходила мысль, что текстовый файл текстовому файлу рознь? И переписывать Ваших Вась и мам из сообщения в файл тоже мало кому охота для помощи Вам же. Поэтому никто не будет Вам коды тут полноценные с комментариями расписывать, когда никому не ясно как там данные вообще в текстовом файле разбиты.
Вот Вам код прохода по двум массивам с заменой - пробуйте, изучайте:
Код
dim arr1, arr2, x1, x2, i As Long
dim bF As Boolean
for each x2 In arr2 'цикл по элементам второго массива
i = i + 1
bF = False 'при каждом проходе ставим флаг в False
for each x1 in arr1 'цикл по элементам первого массива
if x1 = x2 then 'значения в массивах совпали - подменяем
'нашил совпадение - флаг ставим в True,
'чтобы по выходу из цикла понять - нашли значение или нет
bF = true
exit For 'выход из второго цикла, т.к. значение уже найдено. Надо искать следующее
end If
next x1
if bF = false then arr2(i, 1) = "ЯЯЯ"
next x2


P.S. Написан на коленке
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist, спасибо! исчерпывающе.
можете объяснить ламеру, что такое arr2(i, 1) в предпоследней строчке?

насколько  долго все это  будет выполняться на массиве в млн. строк?
 
Так можно получить массив из текста не загружая его на лист:
Arr = Split(CreateObject("Scripting.FileSystemObject").Getfile(full_file_Path$).OpenasTextStream(1).ReadAll, vbNewLine)
(что-то страница глючит, тегов нет)...
А можно и не получить - смотря что за текст.
 
спасибо за отзыв, Hugo!
  1. ой, можно прокоммаентировать или хотя бы прояснить вот этот кусок:
    Цитата
    Hugo написал: Getfile(full_file_Path$).
    full_file_Path$ - в каком фомате? могут ли там быть переменные: у меня много текстовых файлов в одной папке для arr1 и arr2?
  2. почему можно не получить, в чем подводные камешки?
  3. вот тут нашел Ваш код:http://www.planetaexcel.ru/forum/?PAGE_NAME=read&FID=1&TID=45766
Код
With CreateObject("Scripting.FileSystemObject").OpenTextFile("c:\Temp\список.txt", 1)    'Подставьте свой путь к txt-файлу
arrstr = Split(.ReadAll, vbCrLf)    'массив строк текста целиком
End With
попробовал применить к моим файлам - создать массив и потом его выгрузить на лист, так вот: весь массив почему-то состоит из одной первой строчки...
 
Цитата
Hugo написал: А можно и не получить - смотря что за текст.
Цитата
diletant2 написал: попробовал применить к моим файлам - <...> массив почему-то состоит из одной первой строчки...
Может пора этот файл показать?
 
Юрий М,, ОК
 
Цитата
Hugo написал:
Arr = Split(CreateObject("Scripting.FileSystemObject").Getfile(full_file_Path$).OpenasTextStream(1).ReadAll, vbNewLine)
такая же балалайка: весь массив только одна первая строчка... :(
 
Потому что
Цитата
The_Prist написал:
текстовый файл текстовому файлу рознь
никому не ясно как там данные вообще в текстовом файле разбиты.
Попробуйте вместо vbNewLine использовать(каждый по очереди, а не все сразу): vbCr, vbLf, vbCrLf
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist,, ОК, попробую
 
Цитата
The_Prist написал:
Попробуйте вместо vbNewLine использовать(каждый по очереди, а не все сразу): vbCr, vbLf, vbCrLf
увы и ах: все три - выдают в массиве только первую строчку, что делать?  :cry:
 
Транспонировать массив.
Split делает одномерный массив. Ексел одномерный понимает в строку
 
Александр Моторин, спасибо за отзыв!
Цитата
Александр Моторин написал:
Транспонировать массив.
ОК, код можете дописать к уже предложенному:  :qstn:
Цитата
Hugo написал:
Arr = Split(CreateObject("Scripting.FileSystemObject").Getfile(full_file_Path$).OpenasTextStream(1).ReadAll, vbNewLine)
 
Как вставляешь массив на лист?
 
Код
[a1].Resize(UBound(Arr) + 1) = Application.Transpose(Arr)
 
diletant2, такое ощущение что файла нет. Вы по типу людей из контрольной закупки ходите по площади магазина и просто примеряете все подряд не собираясь не чего покупать или взять незначительную мелочь. Люди для Вас посторались, а вы не соизволили даже выложить файл-пример, учитывая что Вас не однократно об этом просили разные люди, ВЫ их игнорите по какой то причине......

Не красиво. Задали вопрос из какого текстового документа выгружаются эти массивы. Так ответа и не увидели.
 
-=ArcheR=-,там миллион строк - Вам все предоставить? обычный словарь в столбик, отсортированный, там выше я выложил кусочек, в чем "врачебная ошибка"? Вы по существу можете что-то сказать?
 
Цитата
diletant2 написал: там миллион строк
Цитата
2.3. Приложите файл(ы) с примером (общим весом не более 100 Кб) в реальной структуре и форматах данных того, что есть сейчас и того, что хотелось бы на выходе.
   2.4. Не прикладывайте файлы-примеры с персональными данными, конфиденциальной информацией, коммерческой или государственной тайной! Яндекс и Google не спят - проиндексируют ваши данные и привет - они попадут в открытый доступ. И даже удаление темы потом не поможет.
Цитата
diletant2 написал: Вам все предоставить?
Ну, разве что в разделе работа -=ArcheR=- возьмётся за Ваше задание.
Изменено: JayBhagavan - 15.12.2015 12:24:14

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
JayBhagavan, это по существу? и так видно, что нечего сказать! :)
 
Кнопка цитирования не для ответа [МОДЕРАТОР]

The_Prist, спасибо, код (из сообщения №10) работает, но очень медленно - часы, формулой ПОИСКПОЗ гораздо быстрее, правда потом проблема с сортировкой... :(
Изменено: diletant2 - 15.12.2015 14:31:32
 
Цитата
Александр Моторин написал: [a1].Resize(UBound(Arr) + 1) = Application.Transpose(Arr)
спасибо, это работает, но на коротких файлах, на больших затыкается Run-time error '13': type mismatch, как обойти?
 
diletant2, я бы на Вашем месте извинился. В противном случае получите штраф или бан.
Страницы: 1 2 След.
Читают тему
Наверх