2016-02-12 2 views
1

У меня есть таблица в Lua следующим образом:Строка чтения из CSV-файла может не индексировать мой стол в Lua

tab = { y = 1, n = 2} 

print(tab) 
{ 
    y : 1 
    n : 2 
} 

Я пытаюсь индексировать его со строкой, которую я прочитал из файла CSV. Следующие работы по их назначению:

print(tab['y']) 
1 

Однако, это не работает, как ожидалось:

local file = io.open(label_file, "r") 

for line in file:lines() do 
    local col = string.split(line, ",") 
    print(type(col[2]))    -> string 
    print(col[2])      -> y 
    print(tab[ (col[2]) ])   -> nil 
end  

Я пытался принуждать седловины [2] в строку, но все равно не индексирует мой стол, как предполагалось ,


Извините за сумбур, я написал функцию String.split но пренебрегли включить его выше в примере кода.

Я разрешил ошибку. Ранее я написал файл CSV с использованием Matlab, и ячейки были отформатированы неправильно как «числа». При изменении форматирования на «текст» код работает по назначению. Очень странно, ошибка, на мой взгляд, что приводит к такого рода вещи:

print(type(col[2]))    -> string 
    print(col[2])      -> y 
    print(col[2] == 'y')    -> false 
+0

Нет строки string.split() в формате lua 5.1 или 5.2, и вы не показывали строки csv, возможно, они разделены чем-то другим, а не запятыми. – Vlad

+0

Не знаете, как это не произошло ... – EinsteinK

+0

попробуйте сделать 'print (string.byte ('y'))' и 'print (string.byte (col [2], 1, #col [2])) ' – moteus

ответ

2

Если вы хотите разделить строку, вы должны будете использовать string.gmatch:

local function split(str,delimiter) -- not sure if spelled right 
    local result = {} 
    for part in str:gmatch("[^"..delimiter.."]+") do 
     result[#result+1] = part 
    end 
    return result 
end 

for line in file:lines() do 
    local col = split(line,",") 
    print(col[2]) --> should print "y" in your example 
    -- well, "y" if your string is "something,y,maybemorestuff,idk" 
    print(tab[col[2]]) -- if it's indeed "y", it should print 1 
end 

виду, что сплит работает с простым шаблоном, который мне слишком ленив, чтобы сбежать автоматически. Это не проблема в вашем случае, но вы можете разделить ЛЮБОЙ символ, используя «% w», ЛЮБОЙ символ, используя «.», ... Если вы хотите использовать «.» в качестве разделителя, используйте «%.».