mirror of
https://github.com/lana-k/sqliteviz.git
synced 2025-12-06 18:18:53 +08:00
Export result set to CSV file #81
This commit is contained in:
113
src/lib/csv.js
Normal file
113
src/lib/csv.js
Normal file
@@ -0,0 +1,113 @@
|
||||
import Papa from 'papaparse'
|
||||
|
||||
const hintsByCode = {
|
||||
MissingQuotes: 'Edit your CSV so that the field has a closing quote char.',
|
||||
TooFewFields: 'Add fields or try another delimiter.',
|
||||
TooManyFields: 'Edit your CSV or try another delimiter.'
|
||||
}
|
||||
|
||||
export default {
|
||||
getResult (source) {
|
||||
const result = {
|
||||
columns: []
|
||||
}
|
||||
const values = {}
|
||||
if (source.meta.fields) {
|
||||
source.meta.fields.forEach(col => {
|
||||
const colName = col.trim()
|
||||
result.columns.push(colName)
|
||||
values[colName] = source.data.map(row => {
|
||||
let value = row[col]
|
||||
if (value instanceof Date) {
|
||||
value = value.toISOString()
|
||||
}
|
||||
return value
|
||||
})
|
||||
})
|
||||
} else {
|
||||
for (let i = 0; i <= source.data[0].length - 1; i++) {
|
||||
const colName = `col${i + 1}`
|
||||
result.columns.push(colName)
|
||||
values[colName] = source.data.map(row => {
|
||||
let value = row[i]
|
||||
if (value instanceof Date) {
|
||||
value = value.toISOString()
|
||||
}
|
||||
return value
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
result.values = values
|
||||
return result
|
||||
},
|
||||
|
||||
prepareForExport (resultSet) {
|
||||
const columns = resultSet.columns
|
||||
const rowCount = resultSet.values[columns[0]].length
|
||||
const result = {
|
||||
fields: columns,
|
||||
data: []
|
||||
}
|
||||
|
||||
for (let rowNumber = 0; rowNumber < rowCount; rowNumber++) {
|
||||
result.data.push(columns.map(column => resultSet.values[column][rowNumber]))
|
||||
}
|
||||
|
||||
return result
|
||||
},
|
||||
|
||||
parse (file, config = {}) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const defaultConfig = {
|
||||
delimiter: '', // auto-detect
|
||||
newline: '', // auto-detect
|
||||
quoteChar: '"',
|
||||
escapeChar: '"',
|
||||
header: false,
|
||||
transformHeader: undefined,
|
||||
dynamicTyping: true,
|
||||
preview: 0,
|
||||
encoding: 'UTF-8',
|
||||
worker: true,
|
||||
comments: false,
|
||||
step: undefined,
|
||||
complete: results => {
|
||||
const res = {
|
||||
data: this.getResult(results),
|
||||
delimiter: results.meta.delimiter,
|
||||
hasErrors: false,
|
||||
rowCount: results.data.length
|
||||
}
|
||||
res.messages = results.errors.map(msg => {
|
||||
msg.type = msg.code === 'UndetectableDelimiter' ? 'info' : 'error'
|
||||
if (msg.type === 'error') res.hasErrors = true
|
||||
msg.hint = hintsByCode[msg.code]
|
||||
return msg
|
||||
})
|
||||
resolve(res)
|
||||
},
|
||||
error: (error, file) => {
|
||||
reject(error)
|
||||
},
|
||||
download: false,
|
||||
downloadRequestHeaders: undefined,
|
||||
downloadRequestBody: undefined,
|
||||
skipEmptyLines: 'greedy',
|
||||
chunk: undefined,
|
||||
chunkSize: undefined,
|
||||
fastMode: undefined,
|
||||
beforeFirstChunk: undefined,
|
||||
withCredentials: undefined,
|
||||
transform: undefined,
|
||||
delimitersToGuess: [',', '\t', '|', ';', Papa.RECORD_SEP, Papa.UNIT_SEP]
|
||||
}
|
||||
|
||||
Papa.parse(file, { ...defaultConfig, ...config })
|
||||
})
|
||||
},
|
||||
|
||||
serialize (resultSet) {
|
||||
return Papa.unparse(this.prepareForExport(resultSet))
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user