Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> числа, числа
portos
сообщение 16.11.2018, 17:58
Сообщение #1


****

Apprentice
Сообщений: 181
Регистрация: 6.12.2014
Группа: Пользователи
Наличность: 0
Пользователь №: 17.157



парни подскажите , есть текстовый документ с цифрами вразброс . можно ли с помощью 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

заранее благодарен
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 16.11.2018, 19:03
Сообщение #2


*******

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
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 16.11.2018, 19:14
Сообщение #3


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



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 и закрывающую скобку.

Сообщение отредактировал DarkMaster - 16.11.2018, 21:13
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
portos
сообщение 16.11.2018, 20:12
Сообщение #4


****

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
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 16.11.2018, 21:22
Сообщение #5


***********

Модератор 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____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 16.11.2018, 21:54
Сообщение #6


***********

Модератор 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____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
portos
сообщение 16.11.2018, 22:12
Сообщение #7


****

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 не по порядку поставил , а так работает на ура

спасибо парни
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 16.11.2018, 22:44
Сообщение #8


***********

Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27708
Пользователь №: 11.279



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

Не должно такого было быть. Можно получить полный исходник и номера строк с ошибкой? Можно в личку, если от глаз надо скрыть.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 16.11.2018, 23:25
Сообщение #9


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Спасибо Дарк за поправки и поддержку, да просто у меня код был под рукой, сортировку тупо вставил из примера, попробовал - работает, вот и выложил, просто в целях взаимопомощи. Я ещё ничего не допиливал, всё по принципу лишь бы работало. Но пока у меня то, что мне надо не работает, так-что я вообще решил прекратить пока работу по lua. Если Кнайт допилит финды - продолжу, а так пока не вижу смысла.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 20.12.2018, 9:03
Сообщение #10


***********

Модератор 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____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 28.3.2024, 17:11
Designed by Nickostyle