Помощь - Поиск - Пользователи - Календарь
Полная версия: числа
UoKit.com Форумы > Кликер > UO Pilot
portos
парни подскажите , есть текстовый документ с цифрами вразброс . можно ли с помощью 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

заранее благодарен
sutra
Код
--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)
sutra
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


Ещё разок скопировал.

Опять с мордой скопировалось, короче, вместо морды поставь b и закрывающую скобку.
portos
Цитата(sutra @ 16.11.2018, 17:14) *

mySort тупо вставил из справки, как-то не так вставилось.

function mySort(a,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
Цитата
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
Если правильно понял, что нужно, то:
Код
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()

Указывайте стобец по которому нужна сортировка либо примеры какие-то более прозрачные, чтобы не разбегались глаза в количестве разрядов.
portos
Цитата(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 не по порядку поставил , а так работает на ура

спасибо парни
DarkMaster
Цитата
именно так и надо ,из 86 строк только 2 не по порядку поставил , а так работает на ура

Не должно такого было быть. Можно получить полный исходник и номера строк с ошибкой? Можно в личку, если от глаз надо скрыть.
sutra
Спасибо Дарк за поправки и поддержку, да просто у меня код был под рукой, сортировку тупо вставил из примера, попробовал - работает, вот и выложил, просто в целях взаимопомощи. Я ещё ничего не допиливал, всё по принципу лишь бы работало. Но пока у меня то, что мне надо не работает, так-что я вообще решил прекратить пока работу по lua. Если Кнайт допилит финды - продолжу, а так пока не вижу смысла.
DarkMaster
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 © 2001-2024 Invision Power Services, Inc.