2

I have the following string data that I receive as input:

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

It represents two "records" of data... where each record has 4 fields. I've built code to parse this string into it's individual columns / fields. But the part that isn't working is when I test to see if I have any duplicates in field 2. Field 2 is the one that currently has "1234" as the value.

Here's the code:

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~,"))

I think where I'm going wrong is the test:

 if list_of_second_column_only[temp] == nil then

I think I'm checking for key with the value temp instead of a value with the value that temp contains. But I don't know how to fix the syntax. Also, I'm wondering if there's a more efficient way to do this. The number of "records" i receive as input is dynamic / unknown, as is the value of the second column in each record.

Thanks.

EDIT 1

The post I was trying to use as a reference is: Search for an item in a Lua list

In the answer, they show how to test for a record in the table by value, instead of looping through the entire table...

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

I was playing around to try and do something similar...

Community
  • 1
  • 1
dot
  • 14,928
  • 41
  • 110
  • 218

2 Answers2

1

This should be a bit more efficient with only one table creation and less regex matching.

The match does require that you're only interested in dups in the second field.

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
Alex
  • 1,017
  • 5
  • 11
0

Try this. It's doing the check on the value of the second field.

I haven't looked at the efficiency.

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
Alex
  • 1,017
  • 5
  • 11