Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] сортировка и разделение по ФИО (http://forum.oszone.net/showthread.php?t=337315)

firemage 22-10-2018 18:49 2837008

сортировка и разделение по ФИО
 
Необходимо создать файл bat который сортирует имена, фамилии и отчества и разделяет их в три отдельных текстовых файла

firemage 22-10-2018 18:50 2837011

(они даны в отдельном текстовом файле)

Elven 22-10-2018 19:14 2837028

нужна структура файла (а лучше он сам или хотя бы кусок) и принцип разделения на эти три файла (в один имена во второй фамилии в третий отчества? или как?)

firemage 22-10-2018 19:17 2837032

Цитата:

Цитата Elven
нужна структура файла (а лучше он сам или хотя бы кусок) и принцип разделения на эти три файла »

лучше и то и другое и заранее спасибо

Iska 22-10-2018 22:21 2837085

Цитата:

Цитата firemage
лучше и то и другое … »

«…и можно без хлеба!»™ :).


firemage, Вам говорят, чтобы Вы упаковали Ваш файл в архив, каковой прикрепили бы к сообщению.

firemage 22-10-2018 22:26 2837088

Вложений: 1
Iska, держите, но тут это роли не играет, можно любые фио брать

alpap 22-10-2018 22:52 2837095

firemage,
невозможно открыть архив.

например вот структура в файле "file.txt"
Скрытый текст

Код:

N=Иванов;SN=Иван;P=Иванович
N=Петров;SN=Петр Константин;P=Захарович
N=Луговой-Дуров;SN=Всеволод;P=Кириллович


а вот разделение:
Код:

@echo off
<file.txt (for /f "tokens=1-3 delims=;" %%a in ('more') do @set "%%a"& set "%%b"& set "%%c"& call :#)
pause& exit

:#
 echo %N% %SN% %P%
exit /b

отправить каждую переменную в свой файл труда, соответственно, не составит.

firemage 22-10-2018 22:54 2837097

Вложений: 1
alpap, Iska, Elven, держите тогда не архивом

alpap 22-10-2018 23:01 2837099

firemage,
я ждал чего-то подобного, но как быть с двойными фамилиями, но хуже того двойными именами?
но интереснее всего то, что:
ну вот раскидали мы имена, фамилии и отчества по отдельным файлам без всякой привязки и что получилось? Рандомный набор имен, фамилий и отчеств в разных файлах, для чего это все, смысл в чем? Что вы хотели этим добиться? Какова глобальная задача?

Iska 22-10-2018 23:29 2837105

Цитата:

Цитата alpap
firemage, невозможно открыть архив. »

Я — открыл.


Цитата:

Цитата firemage
но тут это роли не играет, можно любые фио брать »

Роль играют — кодировка, наличие/отсутствие BOM, тип концов строк. В случае Вашего файла это — 65001/UTF-8 с BOM и стандартные 0x0D, 0x0A в качестве концов строк. А также внутренняя структура содержимого, в Вашем случае в частности — непонятные местами появляющиеся пробелы в конце некоторых строк. Откуда они?

Цитата:

Цитата firemage
сортирует имена, фамилии и отчества и разделяет их в три отдельных текстовых файла »

Мы сначала сортируем, а затем разделяем или же сначала разделяем, а потом сортируем каждый из трёх результирующих файлов отдельно?

firemage 23-10-2018 08:27 2837137

Iska, первое
alpap, двойные фамилии обычно пишутся "фамилия-фамилия"

firemage 23-10-2018 12:49 2837177

Elven, как хотя б просто разделить по фамилиям именам и отчествам (т.е. по 1,2 и 3 слову)

alpap 23-10-2018 13:12 2837181

Цитата:

Цитата firemage
разделить »

если правильно задать, легко и разделить. В моем примере задано было через ; соответственно так и делилось: for /f "tokens=1-3 delims=;"
но все-таки хотелось бы понять смысл того что в итоге. Я понимаю еще привязать к какому-то столбцу, телефонов и т.д., например и построчно раскидывать:
файл1: имя=телефон
файл2: фамилия=адрес
файл3: отчество=email

а какой смысл просто набор имен, например?

YuS_2 23-10-2018 14:32 2837196

firemage,
Если не секрет... Вам, чуть выше задали вопрос: а зачем эти наборы имен, отчеств и фамилий в отдельных файлах? Они ведь никак не будут связаны между собой... в чем смысл?

firemage 23-10-2018 16:40 2837214

YuS_2, alpap, если не секрет, то это такая лаба извращённая

Elven 23-10-2018 17:13 2837220

Если это лаба, значит поиск решения на форумах - это попытка наступить себе на галстук, а так же предложение форумчанам оказать Вам медвежью услугу. Т.к. это лаба, условия ее маловероятно, что будут слишком замороченными, следовательно решение здесь находится через один for. Мне понадобилось 5 строчек, не исключаю, что коллеги обошлись бы даже меньшим количеством, однако решение приводить не очень хочется по причинам указанным в самом начале поста.

alpap 23-10-2018 19:09 2837245

Цитата:

Цитата firemage
это такая лаба »

задание, еще поверю, но не лаба. В любом случае она будет иметь осмысленное завершенное решение и создается для обучения и понимания процессов, а не забивание гвоздей микроскопом.

Elven 23-10-2018 20:27 2837259

alpap, да ладно? а использовать рекурсию для нахождения n-го члена ряда Фибоначчи не забивание указанной оптикой указанных крепежных изделий? А строку переворачивать до задомнапередного состояния через цикл? Лабы могут быть и куда более отбитыми чем сортировка имен фамилий и отчеств по разным файлам.

Iska 23-10-2018 22:21 2837276

Цитата:

Цитата firemage
то это такая лаба извращённая »

firemage, а откуда взялся такой оригинальный fio.txt, в 65001/UTF-8 с BOM?! Даже в дурных лабораторках не должно быть таких исходных файлов.

YuS_2 23-10-2018 22:26 2837277

Цитата:

Цитата Elven
нахождения n-го члена ряда Фибоначчи »

а чего страшного-то? ну микроскоп, ну гвоздь... берем и забиваем. Ну, нет более подходящего инструмента под рукой - а что делать? :)
Кстати о числах Фибоначчи... иногда попадаются высказывания о медленных массивах в powershell, вот и проверим на этих числах, с секундомером в руках:
Код:

$watch = [diagnostics.stopwatch]::startnew()
$watch.start() #Запуск таймера

# запуск: .\script.ps1 n
#где n -  n-ый член ряда Фибоначчи
#    при n = 250000 - TotalSeconds      : 18,4659158
#    при n = 275000 - TotalSeconds      : 60,6238501
#    не рекомендую использовать бОльшие числа, ибо легко поймать переполнение с зависанием


$k = $args[0]
if ($k -lt 2){write-host Должно быть выполнено условие n ≥ 2;sleep 3;break}

$arr = new-object 'bigint[]' ($k+1)

for ($i=0;$i -le $k;$i++){
        if ($i -lt 2){$arr[$i] = $i} else {
                $arr[$i]=$arr[$i-1]+$arr[$i-2]
        }
}
write-host " F₈ = " $arr[8]"`n"`
"F₉ = " $arr[9]"`n"`
"F₁₀ = " $arr[10]"`n"`
"F₁₈ = " $arr[18]"`n"`
"F₁₉ = " $arr[19]"`n"`
"F₂₀ = " $arr[20]"`n"`
"F₂₉₈ = " $arr[298]"`n"`
"F₂₉₉ = " $arr[299]"`n"`
"F₃₀₀ = " $arr[300]"`n"`
"Fn = " $arr[$k]

$watch.stop() #Остановка таймера
$watch.elapsed >startstop.txt #Время выполнения

имхо, вполне приемлемая скорость заполнения массива рядом чисел Фибоначчи... нет? :)

megaloman 24-10-2018 14:13 2837360

Из файла с "Фамилиями Именами Отчествами"
Делаю три файла отдельно с "Фамилиями" "Именами" "Отчествами"
Содержимое каждого файла отсортировано по алфавиту
Код:

@Echo Off                                                                                               

Set "File=Z:\Box_In\file.txt"

Set "Family=Z:\Box_Out\family.txt"
Set "Name=Z:\Box_Out\name.txt"
Set "Patron=Z:\Box_Out\patron.txt"

(FOR /F "usebackq tokens=1 delims= " %%s IN (`more "%File%"`) DO @Echo %%s)|Sort /O "%Family%"
(FOR /F "usebackq tokens=2 delims= " %%s IN (`more "%File%"`) DO @Echo %%s)|Sort /O "%Name%"
(FOR /F "usebackq tokens=3 delims= " %%s IN (`more "%File%"`) DO @Echo %%s)|Sort /O "%Patron%"

Смысла, правда, в этом не вижу никакого

Iska 24-10-2018 18:27 2837401

Цитата:

Цитата megaloman
Содержимое каждого файла отсортировано по алфавиту »

А я понял, что нужно наоборот — отсортировать общий список, затем уже его, отсортированный, делить.

megaloman 24-10-2018 19:15 2837410

Iska понял, что надо отсортировать общий список, затем уже его, отсортированный, делить. Подчиняюсь.
Код:

@Echo Off                                                                                               
Set "File=Z:\Box_In\file.txt"

Set "Family=Z:\Box_Out\family.txt"
Set "Name=Z:\Box_Out\name.txt"
Set "Patron=Z:\Box_Out\patron.txt"

Del "%Family%" "%Name%" "%Patron%" 2>nul
FOR /F "usebackq tokens=1,2,3 delims= " %%i IN (`more "%File%"^|Sort`) DO (
        >>"%Family%" Echo %%i
        >>"%Name%"  Echo %%j
        >>"%Patron%" Echo %%k
)



Время: 11:09.

Время: 11:09.
© OSzone.net 2001-