Что нового

создать папки используя имена из таблицы

Tosyk

Новичок
Сообщения
206
Репутация
0
привет, у меня есть 2 таблицы (разделитель - tab) и файл. первая таблица:

firstnameid lastnameid playerid
0 13572 146
1116 27965 27965
26439 16049 16049
<...>

Вторая таблица с именами где 'nameid' это по сути 'firstnameid' and 'lastnameid' из первой таблицы:

name nameid
K Jacobsen 1116
Al Yousif 26439
A. Alcaraz 27965
Alsultan 16049
<...>

Также тхт-файл со списком ID:

27965
146
16049
<...>

Я хочу бросать этот тхт-файла на скрипт чтобы скрипт создавал список папок с именами вот как тут:

"..\players\0 13572\"
"..\players\K Jacobsen A. Alcaraz\"
"..\players\Al Yousif A. Alsultan\"

я хочу понять принцип. мне нужна или функция или готовый скрипт чтобы я его изучил и понял бы подход. потому что на самом деле ещё глубже всё будет.
Сообщение автоматически объединено:

я начал писать скрипт:

Код:
           Local $arr
           Local $sPlayersTbl = 'players2.txt'
           Local $sSourceFile = 'chars.txt'
           _FileReadToArray($sPlayersTbl, $arr, $FRTA_ENTIRESPLIT, "    ")
           _ArrayDisplay($arr)

        If FileExists($sSourceFile) Then
           Local $arr
           _FileReadToArray($sSourceFile, $arr)
;~         _ArrayDisplay($arr)

         If IsArray($arr) Then
             For $i = 1 to $arr[0]
                 ConsoleWrite($arr[$i] & @LF)
;~               here will be further operations
             Next
         EndIf

пока вроде продвигается хорошо. Только теперь интересно как по данному ID найти строчку в колонке 'playerid' файла players2.txt и вернуть 2 значения из колонок 'firstnameid' и 'lastnameid' на той же строке
 

Вложения

  • players2.txt
    7.9 КБ · Просмотры: 2
  • chars.txt
    13 байт · Просмотры: 2
Последнее редактирование:

Oki

Продвинутый
Сообщения
452
Репутация
62
Скрипт получился нечитабельным из-за бага движка форума.
 

Oki

Продвинутый
Сообщения
452
Репутация
62
И это похоже не на общий вопрос по конкретному языку, а на общий вопрос по умению программировать.
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
И это похоже не на общий вопрос по конкретному языку, а на общий вопрос по умению программировать.
а что в этом плохого? я не умею программировать. делаю что могу.
я не туда написал? подскажите тему где это спросить
 

Oki

Продвинутый
Сообщения
452
Репутация
62
спасибо поправил. этот баг нельзя поправить?
я его наблюдаю уже лет 6 если не больше
Получилось более читабельно, но тоже не так, как задумывалось на форуме. Тоже постоянно натыкаюсь на этот баг. Присоединяюсь к вопросу о том, чтобы его поправили.
Сообщение автоматически объединено:

я хочу понять принцип. мне нужна или функция или готовый скрипт
Принцип прост: пройти в цикле по файлу, считывать строки по одной, разделять данные функцией StringSplit и сравнивать с требуемым значением, чтобы выполнить действие над требуемыми полями, когда сравнение окажется положительным.
Сообщение автоматически объединено:

Код:
$aArray = StringSplit($sText, @TAB)
Это для того, чтобы парсер сгенерировал ссылку на справку (надеюсь, что на этот раз форум сработает без бага).
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
на данный момент мне важно, чтобы чтение происходило в колонках с определёнными именами. я пытаюсь понять как это можно сделать и не могу.
т.е.:
- у меня есть число
- скрипт открывает players2.txt и в колонке playerid ищет это число
- после того как нашёл переходит в колонки firstnameid и lastnameid на той же строке
- и возвращает из этих колонок значения

просто казалось бы концепт, но я не могу понять как это сделать. такое ощущение, что нужно players2.txt читать как 2д массив, искать число, потом конвертировать строку в 1д массив, искать колонки... в общем я не понимаю, поэтому и прошу тут помощи.

я уверен должно быть просто решение. а вообще я хочу написать в итоге довольно сложный скрипт с кучей таблиц поэтому сейчас ищу помощь в "простых" вещах.
 

IMStrelcov

CTPEJIbLLOB
Сообщения
253
Репутация
64
Код:
$Tabl1 = '0 13572 146'&@CRLF
$Tabl1 &= '1116 27965 27965'&@CRLF
$Tabl1 &= '26439'&@TAB&'16049 16049'&@CRLF

$playerid = '146'
$Result = StringRegExpReplace($Tabl1, '(?ism).*(^.*[^0-9])'&$playerid&'$.*|.*', '$1')
ConsoleWrite($playerid &' = '& $Result&@CRLF)

$playerid = '27965'
$Result = StringRegExpReplace($Tabl1, '(?ism).*(^.*[^0-9])'&$playerid&'$.*|.*', '$1')
ConsoleWrite($playerid &' = '& $Result&@CRLF)

$playerid = '16049'
$Result = StringRegExpReplace($Tabl1, '(?ism).*(^.*[^0-9])'&$playerid&'$.*|.*', '$1')
ConsoleWrite($playerid &' = '& $Result&@CRLF)
 

Oki

Продвинутый
Сообщения
452
Репутация
62
просто казалось бы концепт, но я не могу понять как это сделать. такое ощущение, что нужно players2.txt читать как 2д массив, искать число, потом конвертировать строку в 1д массив, искать колонки...
Лучше считывать каждую строку в цикле, сразу конвертировать в одномерный массив функцией StringSplit, проверять тестовое поле, а в случае совпадения сразу иметь в последнем полученном одномерном массиве требуемые значения. Регулярные выражения в данном случае не рекомендую сразу по нескольким причинам. В случае работы с большими объёмами данных желательно для оптимизации скорости выполнения предварительно отсортировать все таблицы и файлы по ключевому значению, сводя к одному проходу массива.
 
Последнее редактирование:

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
спасибо поправил. этот баг нельзя поправить?
я его наблюдаю уже лет 6 если не больше
Что за баг? Новому движку только только 3й год пошел, о чем Вы? Какие 6 лет?
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
Код:
$Tabl1 = '0 13572 146'&@CRLF
$Tabl1 &= '1116 27965 27965'&@CRLF
$Tabl1 &= '26439'&@TAB&'16049 16049'&@CRLF

$playerid = '146'
$Result = StringRegExpReplace($Tabl1, '(?ism).*(^.*[^0-9])'&$playerid&'$.*|.*', '$1')
ConsoleWrite($playerid &' = '& $Result&@CRLF)

$playerid = '27965'
$Result = StringRegExpReplace($Tabl1, '(?ism).*(^.*[^0-9])'&$playerid&'$.*|.*', '$1')
ConsoleWrite($playerid &' = '& $Result&@CRLF)

$playerid = '16049'
$Result = StringRegExpReplace($Tabl1, '(?ism).*(^.*[^0-9])'&$playerid&'$.*|.*', '$1')
ConsoleWrite($playerid &' = '& $Result&@CRLF)
Прошу прощения, я что-то не понимаю как это относится к задаче :/ можете расшифровать?
 

IMStrelcov

CTPEJIbLLOB
Сообщения
253
Репутация
64
Прошу прощения, я что-то не понимаю как это относится к задаче :/ можете расшифровать?
в переменной $Tabl1 содержится то, что к примеру содержится в первой таблице/файле.
$playerid - искомое имя
$Result - другие имена содержащиеся в одной строке с искомым именем ($playerid)
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
в переменной $Tabl1 содержится то, что к примеру содержится в первой таблице/файле.
$playerid - искомое имя
$Result - другие имена содержащиеся в одной строке с искомым именем ($playerid)
Всё равно что-то не понятно. Ведь у меня таблицы двухмерные, тут получатся чтение строк в одномерных таблицах. Как это применить к моим таблицам?
 

IMStrelcov

CTPEJIbLLOB
Сообщения
253
Репутация
64
Всё равно что-то не понятно. Ведь у меня таблицы двухмерные, тут получатся чтение строк в одномерных таблицах. Как это применить к моим таблицам?
Если я правильно понял, то ваши таблицы содержатся в файле, или нет?
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
а вот вторая:
 

Вложения

  • playernames.txt
    1.5 МБ · Просмотры: 1

IMStrelcov

CTPEJIbLLOB
Сообщения
253
Репутация
64
сейчас что нибудь придумаем...
Сообщение автоматически объединено:

Как то так, оно?
Код:
#NoTrayIcon

;считываем файл chars.txt
$sChars = FileRead('chars.txt')
;создаем массив с ID
$aChars = StringRegExp($sChars, '([0-9]+)', 3)

;считываем файл players2.txt
$sPlayersTabl = FileRead('players2.txt')
;удаляем все лишнее, в каждой строке останется только три первых числа с разделителем между ними
$sPlayersTabl = StringRegExpReplace($sPlayersTabl, '(?ims)([0-9]+[^0-9]+[0-9]+[^0-9]+[0-9]+)[^\v]+|[^\v]+\v+', '$1')

;считываем файл playernames.txt
$sNamesTabl = FileRead('playernames.txt')
;удаляем все лишнее, в каждой строке останется только имя и первое число разделителем между ними
$sNamesTabl = StringRegExpReplace($sNamesTabl, '(?ims)([^\v]+)[\h\t]+[0-9]+|[^\v]+\v+', '$1')

;перебираем и обрабатываем каждый ID в массиве $aChars
For $sID In $aChars
   ConsoleWrite($sID&' = '&SearhPlayerName_($sID)&@CRLF)
Next


Func SearhPlayerName_($_sID)
   Local $_aPlayers = StringRegExp($sPlayersTabl, '(?ism)^([0-9]+)[^0-9]([0-9]+)[^0-9]'&$_sID&'$', 3)
   If @error Then Return SetError(1, 0, $_sID)
   Local $_sPlayers, $_sNames, $_sName
   For $_sPlayers In $_aPlayers
      If $_sNames Then $_sNames &= ' '
      $_sName = StringRegExpReplace($sNamesTabl, '(?ism).*(^[^\v]+)\t+'&$_sPlayers&'$.*|.*', '$1')
      If $_sName Then
         $_sNames &= $_sName
      Else
         $_sNames &= $_sPlayers
      EndIf
   Next
   Return $_sNames
EndFunc
 
Последнее редактирование:
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
не совсем. вы в players2.txt удаляете всё кроме первых трёх столбиков как я понял, а нужно не удалять (потому что я буду ещё большинство этих столиков использовать) а искать в столбике playerID

т.е. ещё раз: в файле chars.txt набор ID, эти ID ищем в файле players2.txt в столбике playerID, затем в этом же файле players2.txt смотрим и считываем числа в столбиках firstnameid и lastnameid и эти считанные числа ищем в файле playernames.txt в столбике nameid.

у вас вторая часть, которая формирует на выходе имя работает правильно, а в первой вы ищете ID из chars.txt не в столбике playerID файла players2.txt, а в столбике playerjerseynameid, т.е в одном из трёх оставленных. и не понятно вы ищете по номеру столбика или по имени? потому что нужно именно по имени искать, например: прям указать скрипту - ищи это число на той же строке но в столбике с таким то именем, не в столбике с таким то номером! это важный момент.

я не понимаю как происходит работа функции, можете объяснить? на выходе получается вроде то что нужно - имя и фамилия, но что под капотом? :smile:
 

IMStrelcov

CTPEJIbLLOB
Сообщения
253
Репутация
64
Тогда такой вопрос, в players2.txt порядок столбиков меняется или нет?
Если меняется, то как мне кажется лучше будет грузить эти все данные в ListView и работать уже с ним, к тому же если данных очень много (к примеру свыше 1000 строк), то так будет быстрее чем с массивами или рег. выражениями.
Если же порядок столбиков не меняется, то можно доработать пример выше.
 
Верх