2017-12-27 19 views
2

Ich möchte die Lua CSV http://lua-users.org/wiki/LuaCsv verwenden und benötigen eine der Spalten aufgeteilt, die einen Bindestrich „-“ zum Beispiel: Erste-Name in der Tabelle es schafft. Ich kann es manuell in Excel mit Daten> Text zu Spalten, die die Full-Name-Zelle teilen und fügen Sie eine erste und eine Nachname Spalte bis zum Ende, ich brauche Lua, um das gleiche im Skript zu tun:Lua - Split CSV Säule bei Hyphen

Before 
Age,Name,Start,End,Length,Score 
35,Bill-Smith,2.2.2017,2.4.2017,0.2.00,2056 

After 
Age,Name,Start,End,Length,Score,First,Surname 
35,Bill-Smith,2.2.2017,2.4.2017,0.2.00,2056,Bill,Smith 

Dies wird LUA CSV-Parser eingesetzt werden:

function ParseCSVLine (line,sep) 
    local res = {} 
    local pos = 1 
    sep = sep or ',' 
    while true do 
     local c = string.sub(line,pos,pos) 
     if (c == "") then break end 
     if (c == '"') then 
      -- quoted value (ignore separator within) 
      local txt = "" 
      repeat 
       local startp,endp = string.find(line,'^%b""',pos) 
       txt = txt..string.sub(line,startp+1,endp-1) 
       pos = endp + 1 
       c = string.sub(line,pos,pos) 
       if (c == '"') then txt = txt..'"' end 
       -- check first char AFTER quoted string, if it is another 
       -- quoted string without separator, then append it 
       -- this is the way to "escape" the quote char in a quote. example: 
       -- value1,"blub""blip""boing",value3 will result in blub"blip"boing for the middle 
      until (c ~= '"') 
      table.insert(res,txt) 
      assert(c == sep or c == "") 
      pos = pos + 1 
     else  
      -- no quotes used, just look for the first separator 
      local startp,endp = string.find(line,sep,pos) 
      if (startp) then 
       table.insert(res,string.sub(line,pos,startp-1)) 
       pos = endp + 1 
      else 
       -- no separator found -> use rest of string and terminate 
       table.insert(res,string.sub(line,pos)) 
       break 
      end 
     end 
    end 
    return res 
end 
+0

Was ist Ihre Frage? – Piglet

+0

Was Ferkel gesagt hat. Es ist nicht klar, was genau dein Problem ist. –

+0

Die CSVs haben einen Namensstring mit einem - in der Mitte. Ich brauche Lua, um diese Zelle am Bindestrich zu teilen und sie zu zwei neuen Zellen in der Tabelle hinzuzufügen. https://support.office.com/de-de/article/Split-text-into-different-columns-with-the-Convert-Text-in-Columns-Wizard-30B14928-5550-41F5-97CA-7A3E9C363ED7 – LuaStart

Antwort

0

Unter der Annahme, dass der zweite Wert pro Zeile ist immer der Name und enthält immer den ersten letzten Bindestrich Separator als ersten oder nur Bindestrich im Namen (nicht unbedingt eine sichere Annahme), dann können Sie jede Zeile aus Ihrer Eingabe lesen (ich habe eine Zeichenfolge verwendet, aber dies könnte ein IO-Reader sein oder was auch immer Sie verwenden), analysieren Sie den zweiten Wert mit patterns int o ein Vor- und Nachname, anhängen sie an das Ende der Zeile lesen und dann schreiben Sie es zurück (ich bin es zur Demonstration hier in eine Tabelle einfügen):

local input = [[ 
35,Bill-Smith,2.2.2017,2.4.2017,0.2.00,2056 
31,Ben-Smith,2.4.2015,2.6.2012,0.2.01,2058 
32,Bob-Smith,2.3.2016,2.7.2011,0.2.02,2057 
]] 

local output = {} 

for line in string.gmatch (input, '[^\010\014]+') do --get next group of letters up to the next CR or LF character 
    local name = string.match (line, '^.-,(.-),') -- assuming that the name field is always the second value here 
    local first, last = string.match (name or '', '^(.-)%-(.+)$') 
    line = line .. ',' .. (first or '') .. ',' .. (last or name or '') 
    table.insert (output, line) 
end 

print (table.concat (output, '\r\n')) 

>>>>>>> 
35,Bill-Smith,2.2.2017,2.4.2017,0.2.00,2056,Bill,Smith 
31,Ben-Smith,2.4.2015,2.6.2012,0.2.01,2058,Ben,Smith 
32,Bob-Smith,2.3.2016,2.7.2011,0.2.02,2057,Bob,Smith