разделить каждую отдельную матрицу в отдельный файл - PullRequest
0 голосов
/ 02 мая 2019

file.csv, в котором хранится n матриц.Например,

   A  B  C
A  0  3  4
B  5  0  7
C  7  8  0

   A  B  C  D
A  0  3  4  5 
B  5  0  7  9
C  7  8  0  5
D  7  8  6  0

вся матрица разделена пустой строкой.

Я хочу разделить каждую отдельную матрицу в отдельный файл (1.csv, 2.csv ... n.CSV).Пожалуйста, помогите мне.Спасибо.

Ответы [ 2 ]

0 голосов
/ 03 мая 2019

Соответственно, это должно делать именно то, что вы хотите.

Быстро и грязно

-- read lines
local files, data = {}
for line in io.lines('file.csv') do
  if (line == '') then
    if data then table.insert(files, data) end
    data = nil
  else
    data = (data and (data .. '\n') or '') .. line
  end
end

-- last file
if data then table.insert(files, data) end

-- write files
for i = 1, #files do
  local f = io.open(i .. '.csv', 'w')
  f:write(files[i])
  io.close(f)
end
0 голосов
/ 02 мая 2019

Вот одна возможность.Только часть данных сохраняется в CSV.Если вам нужны заголовки, вам нужно добавить код в save_csv ().Пример данных в строке data.Вы можете инициализировать data, загрузив в него любой файл, который вам нравится.

data = [[

   A  B  C
A  0  3  4
B  5  0  7
C  7  8  0



   A  B  C  D
A  0  3  4  5
B  5  0  7  9
C  7  8  0  5
D  7  8  6  0


]]

--------------------------------------------------------------------------------
local cc = table.concat
--------------------------------------------------------------------------------
function save_csv(filenumber,t)
  io.open(filenumber .. '.csv','w'):write(cc(t,'\n')):close()
end
--------------------------------------------------------------------------------
local filenumber = 1
local ans = {}

for line in (data..'\n'):gmatch '(.-)\n' do
  local s = {}
  for item in line:gmatch '%d+' do s[#s+1] = item end
  if #s > 0 then
    ans[#ans+1] = cc(s,',')
  elseif #ans > 0 then
    save_csv(filenumber,ans)
    filenumber = filenumber + 1
    ans = {}
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...