-
Notifications
You must be signed in to change notification settings - Fork 121
/
Copy pathcsv.js
130 lines (121 loc) · 3.51 KB
/
csv.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
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, columns) {
const result = {
columns: 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 if (columns) {
columns.forEach((col, i) => {
values[col] = source.data.map(row => {
let value = row[i]
if (value instanceof Date) {
value = value.toISOString()
}
return value
})
})
} else {
for (let i = 0; source.data[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 => {
let res
try {
res = {
data: this.getResult(results, config.columns),
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
})
} catch (error) {
reject(error)
}
resolve(res)
},
error: error => {
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), { delimiter: '\t' })
}
}