Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1 2 3 4 След.
RSS
Как отсортировать 5 миллионов строк?
 
Здравствуйте.
Существует файл txt в котором содержаться 1000 ссылок (одна ссылка на строку). Все ссылки уникальные. Задача состоит в том, чтобы отсортировать все ссылки по возрастающей, ориентируясь на число, которое как правило стоит после последнего слеша /
Пример ссылок:
https://mysite.com/file/ayywfybnywxn/1465935
https://mysite.com/file/omvyecfnqaco/4975784
https://mysite.com/file/wbmvseojgocd/9469743
https://mysite.com/file/wbmvseojgocd/4992568
https://mysite.com/file/nxhhrszispxv/3776491

Последовательность моих действий:
1) В файле txt c помощью поиска и замены заменяю все / на /табуляция
2) Открываю новую книгу Excel и скопировав содержимое файла txt вставляю всё это в Excel
3) В итоге у меня создается 1000 строк и 6 колонок
4) Выделяю первую строки и с помощью ПКМ >Вставить создаю новую пустую строку
5) Выделяю первых 6 колонок этой строки и включаю функцию Фильтр
6) Теперь я могу сортировать по возрастанию все строки, ориентируясь на шестую колонку, в которой содержаться числа
7) Нужный результат выделяю и копирую в файл txt
8) С помощью поиска и замены удаляю всю табуляцию и вот все ссылки отсортированы так, ка мне надо.
Пример результата:
https://mysite.com/file/ayywfybnywxn/1465935
https://mysite.com/file/nxhhrszispxv/3776491
https://mysite.com/file/omvyecfnqaco/4975784
https://mysite.com/file/wbmvseojgocd/4992568
https://mysite.com/file/wbmvseojgocd/9469743

В данном случае я использую Excel, как инструмент для сортировки строк.
Проблема в том, что иногда в файле txt содержится несколько миллионов строк!

Вопрос: как в данном случае я могу отсортировать строки?
Попробовал использовать Power Pivot и вроде бы всё работает: импорт данных происходит успешно, с колонками и строками тоже всё в порядке, сортировка работает отлично, но не понимаю, как мне сохранить полученный результат. Сохраняются пустые файлы и больше ничего.
Возможно есть другие способы решения моей задачи?
 
Цитата
georgmann написал:
Возможно есть другие способы решения моей задачи?
Не использовать Excel например. Загрузите в Access или SQL там все отсортируется.
По вопросам из тем форума, личку не читаю.
 
Спасибо за совет. Попробовал Access. Да, всё загружается и сортируется. А как потом сохранить результат в файл txt?
 
georgmann, здравствуйте!
Вот тут есть хороший сортировщик (для VBA Excel)
Изменено: Jack Famous - 27 Июн 2020 18:43:48
Реквизиты для благодарностей — в профиле
 
Миллионы строк будет поддерживаться?
 
georgmann, зависит от оперативной памяти - если хватит, то отсортировать массив из 5 млн элементов должно меньше чем за минуту, но тут всё от железа зависит
Пробуйте
Реквизиты для благодарностей — в профиле
 
Цитата
Jack Famous написал:
Пробуйте
Посмотрел, почитал. Для меня VBA это тёмный лес. Не могу понять, как этим пользоваться.
 
Цитата
georgmann: Для меня VBA это тёмный лес
тогда у вас 2 варианта:
  1. создать тему в платной ветке. Там всё сделают за вас, только платите
  2. самому сортировать с помощью PQ, Access, SQL или чем-либо другим (что для вас НЕ тёмный лес)
Изменено: Jack Famous - 27 Июн 2020 19:35:07
Реквизиты для благодарностей — в профиле
 
Цитата
georgmann написал:
А как потом сохранить результат в файл txt?
ну рекордсэт построчно в файл записать не сложно, да и просто экспортировать можно, но вот не вопрос это Excel.
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ: не вопрос это Excel
привет))
ну почему же? VBA Excel вполне в состоянии открыть txt, отсортировать в памяти и записать обратно
Реквизиты для благодарностей — в профиле
 
Цитата
БМВ написал:
Загрузите в Access
Разобрался! Access мне вполне достаточно. Там есть функция "Экспорт", которой я изначально просто не видел! Как всё банально просто! Ещё раз спасибо всем за помощь и участие! А БМВ за хорошую наводку!
 
Код
powershell "gci 'd:\txt' -file|%{gc $_.FullName -enc UTF8|Sort {[double]$_.split('/')[-1]}|sc $_.FullName}"
Изменено: Андрей Лящук - 27 Июн 2020 22:14:16
 
О, Рowershell - это интерсно! Но почему-то не работает ни первый, ни изменённый вариант.
Если я правильно понял, указываю путь к файлу таким образом
Код
powershell "gci 'c:\input.txt' -file|%{gc $_.FullName -enc UTF8|Sort {[double]$_.split('/')[-1]}|sc $_.FullName}"
 
d:\txt - папка, в которой лежат файлы txt
для одного файла можно так
Код
powershell "'c:\input.txt'|%{gc $_ -enc UTF8|Sort {[double]$_.split('/')[-1]}|sc $_}"
Изменено: Андрей Лящук - 27 Июн 2020 23:10:21
 
Цитата
Андрей Лящук написал:
для одного файла можно так
После запуска просит что-то ввести:
c:\2>powershell -executionpolicy RemoteSigned -file myscript.ps1

cmdlet Get-Content at command pipeline position 1
Supply values for the following parameters:
Path[0]:
 
Цитата
Jack Famous написал:
VBA Excel вполне в состоянии открыть txt
именно по этому я и говорю, что Excel не при делах. процедуру можно выполнить в любом приложении поддерживающем VBA, а если так, то и просто VBS скрипта будет достаточно, да еще бонусом пойдет использование аргументов и возможность просто перетащить файл txt на файл VBS и получить результат. Как правильно отметил Андрей, PowerShell еще мощнее, хотя не всегда понятен, но CMDLETы есть на столько мощные , что оправдывают слово Power на все 100%.
Изменено: БМВ - 28 Июн 2020 09:40:18
По вопросам из тем форума, личку не читаю.
 
Offtop
Цитата
БМВ написал:
процедуру можно выполнить в любом приложении поддерживающем VBA
А где ещё ТС надут алгоритмщиков, как не на форуме по Excel? Сюда толпами за решением экономических, логистических и прочих задач ходят, причём включая именно и решение задачи, а уж Excel весьма и весьма опосредовано - просто другими средами не интересуются или на других форумах от ворот поворот. :)  Люди ж не любят думать - просто хотят на блюдечке с голубой каёмочкой поиметь и совершенно бесплатно :)
Изменено: Андрей VG - 28 Июн 2020 08:51:32
 
Андрей Лящук, PowerShell нечасто тут на форуме встретишь - интересная штука, спасибо  :idea:
Нашёл мануал по Sort-Object, а что у вас - не нашёл  :D

Цитата
БМВ: просто VBS скрипта будет достаточно
в случае переполнения памяти, Excel можно использовать для предварительной выгрузки/хранения блоков при сортировке))
Но это уже, конечно, совсем костыль))
Изменено: Jack Famous - 28 Июн 2020 10:42:38
Реквизиты для благодарностей — в профиле
 
Цитата
Jack Famous написал:
в случае переполнения памяти
64 битная версия - и нет проблем. На строках, подобных примеру ТСа, в файле: кодировка ANSI, переносы строк VbCrLf для 5000000 строк макрос
Скрытый текст
отработал за 54 секунды, отъедая около 1,2 Гигабайта памяти, что в современных условиях не смертельно, лишь бы Excel был 64 бита :)
 
Андрей VG, круто - Recordset тоже мощная вещь  8)

georgmann, можете дать ваш исходный файл (замените домен, если нужно)?
Хочу потестить…
Реквизиты для благодарностей — в профиле
 
Цитата
Jack Famous написал:
можете дать ваш исходный файл
Да, пожалуйста, скачать. Здесь секретов нет.
 
Версия Андрея VG из #19 за 62 сек выдала ошибку Type mismatch
на строке кода pRSet(0).Value = CLng(Mid$(strData, InStrRev(strData, "/") + 1))
после строки "subStrs(3880285) : https://photodune.net/item/teddy-bear-hung-out-to-dry/12180928/support"
и счётчике i = 3 882 285
— псоле последнего слэша в этой строке текст "support", а должно быть число. Необходимо вводить дополнительные проверки…
Изменено: Jack Famous - 28 Июн 2020 14:01:27
Реквизиты для благодарностей — в профиле
 
Цитата
Jack Famous написал:
видимо оригинальные данные чем-то отличаются от тестовых
В тестовых данных я не указал что числа, которые находятся после последнего слеша, разной длины. Может быть в этом причина?
 
Цитата
Jack Famous написал:
Нашёл мануал по  Sort-Object , а что у вас - не нашёл
дык отсюда все Sort-Object (он же просто Sort)список псевдонимов коммандлетов - Get-Alias или просто Alias
 
Цитата
georgmann: не указал что числа, которые находятся после последнего слеша, разной длины
не совсем - Андрей берёт всё после последнего слэша и преобразует в целое число функцией CLng(), а в этой строке у вас после последнего слэша идёт "support"  - вот и всё

Андрей Лящук, спасибо! Сможете прикрутить свою версию к тестовому файлу?
Изменено: Jack Famous - 28 Июн 2020 14:03:34
Реквизиты для благодарностей — в профиле
 
Цитата
Jack Famous написал:
идёт "support"  - вот и всё
:D
 
Цитата
Jack Famous написал:
после последнего слэша идёт "support"
Да, такое случайно может попасться.
Изменено: georgmann - 28 Июн 2020 14:21:28
 
Прикрутил доп. проверку и подключил ADODB через ссылки - у меня отработало за 89 секунд без проблем
Коды
сейчас соображаю свой вариант
Изменено: Jack Famous - 28 Июн 2020 14:30:42
Реквизиты для благодарностей — в профиле
 
Цитата
georgmann написал:
Да, такое случайно может попасться.
Но показывать такое в примере я такого не буду, чтобы не нарушать девиз - Моя голова чужим рукам покоя не даёт! :)  Поэтому даже извинятся не буду - ещё один девиз - Пустяки, дело-то житейское!
Добавим регулярок чуток. Время подросло до 76 секунд.
Скрытый текст
 
Андрей VG, а запусти мой вариант твоего решения - сколько будет? Мне кажется, что строковые должны выиграть + такие моменты скорее исключения, чем правило
Изменено: Jack Famous - 28 Июн 2020 14:29:18
Реквизиты для благодарностей — в профиле
Страницы: 1 2 3 4 След.
Читают тему (гостей: 4)
Наверх