-
Notifications
You must be signed in to change notification settings - Fork 66
Expand file tree
/
Copy pathparser.coffee
More file actions
55 lines (36 loc) · 1.4 KB
/
parser.coffee
File metadata and controls
55 lines (36 loc) · 1.4 KB
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
{EventEmitter} = require 'events'
Header = require './header'
fs = require 'fs'
iconv = require 'iconv-lite'
class Parser extends EventEmitter
constructor: (@filename, @encoding) ->
parse: =>
@emit 'start', @
@header = new Header @filename
@header.parse (err) =>
@emit 'header', @header
sequenceNumber = 0
fs.readFile @filename, (err, buffer) =>
throw err if err
loc = @header.start
while loc < (@header.start + @header.numberOfRecords * @header.recordLength) and loc < buffer.length
@emit 'record', @parseRecord ++sequenceNumber, buffer.slice loc, loc += @header.recordLength
@emit 'end', @
return @
parseRecord: (sequenceNumber, buffer) =>
record = {
'@sequenceNumber': sequenceNumber
'@deleted': (buffer.slice 0, 1)[0] isnt 32
}
loc = 1
for field in @header.fields
do (field) =>
record[field.name] = @parseField field, buffer.slice loc, loc += field.length
return record
parseField: (field, buffer) =>
encoding = 'utf-8'
encoding = @encoding if @encoding
value = iconv.decode(buffer, encoding).replace /^\x20+|\x20+$/g, ''
if field.type is 'N' then value = parseInt value, 10
return value
module.exports = Parser