2014-10-01 2 views
2

Я ищу самый простой способ, чтобы прочитать строку, которая находится в файле с переменным числом линий позади:чтение специальных строк в Lua

UserName = herecomesthestring

Я думал о hardcoding a linenumber, но это не сработает, потому что в этом файле UserName может быть более одного раза, а номера строк не совпадают (от пользователя к пользователю они могут измениться).

+0

Вы хотите прочитать строки X из файла до определенной строки в файле? –

+0

Кажется, вы хотите читать строки до тех пор, пока вы не сравните их с рисунком. Это правда? – Deduplicator

+0

Предположим, файл содержит 13 строк UserName = tom ... все эти строки являются переменными по смыслу содержащегося имени пользователя. «Префикс» UserName = стоит перед именем пользователя EVERY. Я ищу простой способ вернуть все имена пользователей. Массив будет лучшим. Пример вывода: {tom, peter, jack} – Pekinese

ответ

1
  1. Прочитайте файл линия за линией
  2. матча линия и извлечь имя пользователя
  3. Положите его в список
function getusers(file) 
    local list, close = {} 
    if type(file) == "string" then 
     file, close = io.open(file, "r"), true 
    end 
    for line in file:lines() do 
     local user, value = line:match "^([^=]+)=([^\n]*)$" 
     if user then -- Dropping mal-formed lines 
      table.insert(list, user) 
      list[user] = value -- Might be of interest too, so saving it 
     end 
    end 
    if close then 
     file:close() 
    end 
    return list 
end 

вызов либо с файлом или имя файла.

+0

Является ли мое использование функции правильным? 'local f = assert (io.open ('file2.ini'," r ")) local t = f: read (" * all ") getusers (t)' – Pekinese

+0

Не совсем. Во всяком случае, изменил его: теперь вы можете позвонить ему либо с именем файла, либо с файлом по вашему выбору. – Deduplicator

0

Я отредактировал функцию выше бит, теперь она работает более или менее, просто нужно отредактировать RegEx.

function getusers(file) 
local list, close = {} 
    local user, value = string.match(file,"(UserName=)(.*)") 
    print(value) 
    f:close() 
end 
Смежные вопросы