парни подскажите , есть текстовый документ с цифрами вразброс . можно ли с помощью uopilot или lua записать цифры по порядку
пример:
есть
uuu 23 3333333
uuu 2 3333333
uuu 16 3333333
uuu 7 3333333
uuu 20 3333333
надо
uuu 2 3333333
uuu 7 3333333
uuu 16 3333333
uuu 20 3333333
uuu 23 3333333
заранее благодарен
--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()
mySort тупо вставил из справки, как-то не так вставилось.
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 arr = {}
arr[1] = "vasya"
arr[2] = "petya"
arr["humans"] = true
log (#arr) -- вывод: 2.
Если правильно понял, что нужно, то:
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()
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()
Спасибо Дарк за поправки и поддержку, да просто у меня код был под рукой, сортировку тупо вставил из примера, попробовал - работает, вот и выложил, просто в целях взаимопомощи. Я ещё ничего не допиливал, всё по принципу лишь бы работало. Но пока у меня то, что мне надо не работает, так-что я вообще решил прекратить пока работу по lua. Если Кнайт допилит финды - продолжу, а так пока не вижу смысла.
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()
Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)