j
initial commit
402daee
--[[
CSVWriter.lua - Write CSV files
]]--
CSVWriter = Polo {
TIME_FORMAT = '%02d:%02d:%02d,%03d',
DELIMITERS = {
{ char = ',', name = 'Comma' },
{ char = ';', name = 'Semicolon' },
{ char = '\t', name = 'Tab' },
},
new = function(options)
options = options or {}
return {
file = options.file,
delimiter = options.delimiter or ',',
include_header_row = options.include_header_row or false,
}
end,
}
function CSVWriter:init()
assert(self.file, 'missing file')
end
CSVWriter.format_time = function (time)
local milliseconds = math.floor(time * 1000) % 1000
local seconds = math.floor(time) % 60
local minutes = math.floor(time / 60) % 60
local hours = math.floor(time / 3600)
return string.format(CSVWriter.TIME_FORMAT, hours, minutes, seconds, milliseconds)
end
function CSVWriter:write(transcript)
if self.include_header_row then
self:write_header_row()
end
local sequence_number = 1
for _, segment in pairs(transcript:get_segments()) do
self:write_segment(segment, sequence_number)
sequence_number = sequence_number + 1
end
end
function CSVWriter:write_header_row()
local fields = {
CSVWriter._quoted('Sequence Number'),
CSVWriter._quoted('Start Time'),
CSVWriter._quoted('End Time'),
CSVWriter._quoted('Text'),
CSVWriter._quoted('File'),
}
self.file:write(table.concat(fields, self.delimiter))
self.file:write('\n')
end
function CSVWriter:write_segment(segment, sequence_number)
local start = segment:get('start')
local end_ = segment:get('end')
local text = segment:get('text')
local file = segment:get_file_with_extension()
self:write_line(text, sequence_number, start, end_, file)
end
function CSVWriter:write_line(line, sequence_number, start, end_, file)
local fields = {
sequence_number,
CSVWriter._quoted(CSVWriter.format_time(start)),
CSVWriter._quoted(CSVWriter.format_time(end_)),
CSVWriter._quoted(line),
CSVWriter._quoted(file),
}
self.file:write(table.concat(fields, self.delimiter))
self.file:write('\n')
end
function CSVWriter._quoted(input_string)
return table.concat({'"', input_string:gsub('"', '""'), '"'})
end