|
|
|
числа, числа |
|
|
sutra |
16.11.2018, 19:03
|
Adept
Сообщений: 923
Регистрация: 10.8.2018 Группа: Пользователи Наличность: 0
Пользователь №: 19.007
|
Код --lua function LoadArray(arr,FileName) local sep=chr(32) -- определяем разделитель строки (пробел) local nar={} -- создаём массив для чтения строк файла local f=io.open(FileName,"r") for v in f:lines() do -- читаем файл по строкам nar[#nar+1]=v -- добавляем в массив end f:close() -- закрыть файл for ci=1, #nar do i,x=1,1 -- i индекс столбца массива, x позиция поиска в строке табуляции dl = string.len(nar[ci]) table.insert (arr, {}) while true do ns = string.find(nar[ci],sep,x,true) if type(ns) == "nil" then dd = dl else dd = ns-1 end stmp = string.sub(nar[ci],x,dd) dig = tonumber(stmp) if type(dig) == "nil" then arr[ci][i] = stmp else arr[ci][i] = dig end if type(ns) == "nil" then break end i,x=i+1,ns+1 end end end function SaveArray(arr,FileName) local f=io.open(FileName,"w") for ci=1,#arr do for i=1,#arr[ci] do if i == #arr[ci] then f:write(arr[ci][i]) else f:write(arr[ci][i] .. chr(32)) end end f:write("\r\n") end f:close() end function mySort(a,B) if a[1] < b [1] then return true else if a[1] == b [1] and a[2] < b [2] then -- если первые элементы равны, сравнить вторые return true end end return false end local tmp={} local filename = [[C:\TMP\234.txt]] LoadArray(tmp,filename) table.sort(tmp,mySort) local filenamenew = [[C:\TMP\345.txt]] SaveArray(tmp,filenamenew) stop_script()
Дарк, отформатируй мою хрень. Поскольку текстовый файл, поэтому разделителем является пробел, если по уму, то надо делать табуляцию chr(9) вместо пробела chr(32) Сообщение отредактировал DarkMaster - 16.11.2018, 21:12
|
|
|
|
portos |
16.11.2018, 20:12
|
Apprentice
Сообщений: 181
Регистрация: 6.12.2014 Группа: Пользователи Наличность: 0
Пользователь №: 17.157
|
Цитата(sutra @ 16.11.2018, 17:14) mySort тупо вставил из справки, как-то не так вставилось. function mySort(a,(IMG: style_emoticons/default/cool.gif) if a[1] < b [1] then return true else if a[1] == b [1] and a[2] < b [2] then -- если первые элементы равны, сравнить вторые return true end end return false end Ещё разок скопировал. Опять с мордой скопировалось, короче, вместо морды поставь b и закрывающую скобку. немного не так пример написал 7323333 uuu9 23 3343433 31633333 uuu1 2 33563333 8333363 uuu 16 13536333 23233433 uuu0 7 8333033 3339333 uuu11 20 7339373 надо 31633333 uuu1 2 33563333 23233433 uuu0 7 8333033 8333363 uuu 16 13536333 3339333 uuu11 20 7339373 7323333 uuu9 23 3343433
|
|
|
|
DarkMaster |
16.11.2018, 21:22
|
Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 27708
Пользователь №: 11.279
|
Цитата table.insert (arr, {}) имхо инсерт имеет право на жизнь только, если вставлять не в хвост. перкрасно работает: arr[#arr +1] = {} # - оператор получения размера. Прекрасно работает в т.ч. с массивами нулевой длины. Данный оператор _не_ считает таблицы (ключ текстовый). Поскольку в луа массивы могут быть смешенными - это бывает достаточно удобно. Т.е.: Код local arr = {} arr[1] = "vasya" arr[2] = "petya" arr["humans"] = true log (#arr) -- вывод: 2. Цитата dl = string.len(nar[ci]) Тоже можно заменить на: #nar[ci] Формально справедливо только для ASCII, но луа работает только с ним так, что разницы никакой. // На самом деле есть целая куча модулей для работы с UTF, в т.ч. написанных на pure lua. Сообщение отредактировал DarkMaster - 16.11.2018, 21:19
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
DarkMaster |
16.11.2018, 21:54
|
Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 27708
Пользователь №: 11.279
|
Если правильно понял, что нужно, то: Код local input_file = io.open([[d:\1.txt]], "rb") local output_file = io.open([[d:\2.txt]], "wb")
if not input_file then log ("Исходный файл не может быть открыт.") end
if not output_file then log ("Файл с результатом не может быть создан.") end
local raw_arr = {} for line in input_file:lines() do log (line) raw_arr[#raw_arr + 1] = {string.match(line, "(.+ .+ )(.+)( .+)")} end input_file:close()
table.sort(raw_arr, function(a,b) if tonumber(a[2]) < tonumber(b[2]) then return true else return false end end )
for i = 1, #raw_arr do output_file:write(unpack(raw_arr[i])) end output_file:close() Указывайте стобец по которому нужна сортировка либо примеры какие-то более прозрачные, чтобы не разбегались глаза в количестве разрядов. Сообщение отредактировал DarkMaster - 16.11.2018, 21:55
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
portos |
16.11.2018, 22:12
|
Apprentice
Сообщений: 181
Регистрация: 6.12.2014 Группа: Пользователи Наличность: 0
Пользователь №: 17.157
|
Цитата(DarkMaster @ 16.11.2018, 19:54) Если правильно понял, что нужно, то: Код local input_file = io.open([[d:\1.txt]], "rb") local output_file = io.open([[d:\2.txt]], "wb")
if not input_file then log ("Исходный файл не может быть открыт.") end
if not output_file then log ("Файл с результатом не может быть создан.") end
local raw_arr = {} for line in input_file:lines() do log (line) raw_arr[#raw_arr + 1] = {string.match(line, "(.+ .+ )(.+)( .+)")} end input_file:close()
именно так и надо , из 80 строк только 2 не по порядку поставил спасибо за помощь
table.sort(raw_arr, function(a,b) if tonumber(a[2]) < tonumber(b[2]) then return true else return false end end )
for i = 1, #raw_arr do output_file:write(unpack(raw_arr[i])) end output_file:close() Указывайте стобец по которому нужна сортировка либо примеры какие-то более прозрачные, чтобы не разбегались глаза в количестве разрядов. именно так и надо ,из 86 строк только 2 не по порядку поставил , а так работает на ура спасибо парни
|
|
|
|
sutra |
16.11.2018, 23:25
|
Adept
Сообщений: 923
Регистрация: 10.8.2018 Группа: Пользователи Наличность: 0
Пользователь №: 19.007
|
Спасибо Дарк за поправки и поддержку, да просто у меня код был под рукой, сортировку тупо вставил из примера, попробовал - работает, вот и выложил, просто в целях взаимопомощи. Я ещё ничего не допиливал, всё по принципу лишь бы работало. Но пока у меня то, что мне надо не работает, так-что я вообще решил прекратить пока работу по lua. Если Кнайт допилит финды - продолжу, а так пока не вижу смысла.
|
|
|
|
DarkMaster |
20.12.2018, 9:03
|
Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 27708
Пользователь №: 11.279
|
fix Код local input_file = io.open([[d:\1.txt]], "rb") local output_file = io.open([[d:\2.txt]], "wb")
if not input_file then log ("Исходный файл не может быть открыт.") end_script () end
if not output_file then log ("Файл с результатом не может быть создан.") end_script () end
local raw_arr = {} for line in input_file:lines() do raw_arr[#raw_arr + 1] = {string.match(line, "([^ ]+ [^ ]+ )([^ ]+)(.+)")} end
if (string.sub (raw_arr[#raw_arr][3], -1)) ~= '\r' then raw_arr[#raw_arr][3] = raw_arr[#raw_arr][3] .. '\r' end input_file:close()
table.sort(raw_arr, function(a,b) if tonumber(a[2]) < tonumber(b[2]) then return true else return false end end )
for i = 1, #raw_arr do output_file:write(unpack(raw_arr[i])) end output_file:close()
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|