2013-10-01 1 views
2

У меня есть следующие строки данных, которые я получаю в качестве входных данных:Lua - проверка дубликатов данных в строке

"route1,1234,1,no~,,route2,1234,1,no~," 

Он представляет собой две «записи» данных ... где каждая запись имеет 4 поля. Я создал код для синтаксического анализа этой строки в отдельные столбцы/поля. Но часть, которая не работает, проверяет, есть ли у меня какие-либо дубликаты в поле 2. Поле 2 является тем, которое в настоящее время имеет значение «1234».

Вот код:

function string:split(delimiter) 
    local result = { } 
    local from = 1 
    local delim_from, delim_to = string.find(self, delimiter, from) 
    while delim_from do 
    table.insert(result, string.sub(self, from , delim_from-1)) 
    from = delim_to + 1 
    delim_from, delim_to = string.find(self, delimiter, from) 
    end 
    table.insert(result, string.sub(self, from)) 
    return result 
end 

local check_for_duplicate_entries = function(route_data) 
     local route 
     local route_detail = {} 
     local result =true 
     local errtxt 
     local duplicate = false 

print("received :" ..route_data) 
     route = string.gsub(route_data, "~,,", "~") 
     route = route:sub(1,string.len(route)-2) 
print("route :" ..route) 

     -- break up in to an array 
     route = string.split(route,"~") 

     for key, value in pairs(route) do 
      route_detail[key] = string.split(value,",") 
     end 

     local list_of_second_column_only = {} 
     for key,value in pairs(route_detail) do 
     local temp = value[2] 
     print(temp .. " - is the value I'm checking for") 
     if list_of_second_column_only[temp] == nil then 
      print("i dont think it exists") 
      list_of_second_column_only[key] = value[2] 
      print(list_of_second_column_only[key]) 
     else 
      --found a duplicate. 
      return true 
     end 
     end 
     return false 
end 

print(check_for_duplicate_entries("route1,1234,1,no~,,route2,1234,1,no~,")) 

Я думаю, где я буду неправильно это испытание:

if list_of_second_column_only[temp] == nil then 

Я думаю, что я проверяю для ключа с температурой значения вместо значения со значением, которое содержит temp. Но я не знаю, как исправить синтаксис. Кроме того, мне интересно, есть ли более эффективный способ сделать это. Число «записей», которые я получаю в качестве входных данных, является динамическим/неизвестным, равно как и значение второго столбца в каждой записи.

Спасибо.

EDIT 1

Сообщение Я пытался использовать в качестве ссылки: Search for an item in a Lua list

В ответ, они показывают, как проверить записи в таблице по значению, а не зацикливание через весь стол ...

if items["orange"] then 
    -- do something 
end 

Я играл вокруг, чтобы попытаться сделать что-то подобное ...

ответ

1

Это должно быть немного более эффективно при создании только одного стола и меньшем совпадении регулярных выражений.

match действительно требует, чтобы вас интересовали только дублирующие устройства во втором поле.

local function check_for_duplicate_entries(route_data) 
    assert(type(route_data)=="string") 
    local field_set = {} 
    for route in route_data:gmatch"([^~]*)~,?,?" do 
     local field = route:match",([^,]*)" 
     if field_set[field] then 
      return true 
     else 
      field_set[field] = true 
     end 
    end 
    return false 
end 
+0

Эй, Алекс. Это отлично работает. Благодаря! – dot

0

Попробуйте это. Он выполняет проверку значения второго поля.

Я не смотрел на эффективность.

if list_of_second_column_only[value[2]] == nil then 
    print("i dont think it exists") 
    list_of_second_column_only[value[2]] = true 
    print(list_of_second_column_only[value[2]]) 
else 
    --found a duplicate. 
    return true 
end 
Смежные вопросы