2017-12-27 28 views
2

私はLua CSV http://lua-users.org/wiki/LuaCsv を使用したいのでハイフン「 - 」を使用するカラムの1つを分割する必要があります。 Data> Text to Columnsで手動で行うことができます。フルネームのセルを分割し、最初と姓の列を最後に追加するには、スクリプトで同じことを行うにはLuaが必要です。ハイフンでのLua - 分割CSVカラム

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 

これは使用するLuaのCSVパーサである:

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

どのような質問ですか? – Piglet

+0

ピグレットは言った。あなたの問題/質問がここに何であるかははっきりしていません。 –

+0

csvの名前文字列の中央に - が付いています。そのセルをハイフンで分割してテーブルの2つの新しいセルに追加するには、Luaが必要です。 https://support.office.com/en-us/article/Split-text-into-different-columns-with-the-Convert-Text-to-Columns-Wizard-30B14928-5550-41F5-97CA-7A3E9C363ED7 – LuaStart

答えて

0

は(行あたりの第二の値が常に名前であると仮定すると、常に名前の最初または唯一のハイフンように、第1、最後のハイフンセパレータを含ん必ずしも安全な仮定ではない)、入力から各行を読み込むことができます(私は文字列を使用しましたが、これはIOリーダまたは使用しているものである可能性があります)。パターンintを使用して2番目の値を解析します最初と最後の名前を読み込み行の末尾に追加して書き戻します(デモ用にテーブルに挿入します)

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