File: tsv_codec.go

package info (click to toggle)
miller 6.16.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 87,928 kB
  • sloc: ruby: 162; sh: 119; makefile: 87
file content (67 lines) | stat: -rw-r--r-- 1,369 bytes parent folder | download | duplicates (3)
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
package lib

import (
	"bytes"
)

// * https://en.wikipedia.org/wiki/Tab-separated_values
// * https://www.iana.org/assignments/media-types/text/tab-separated-values
//   \n for newline,
//   \r for carriage return,
//   \t for tab,
//   \\ for backslash.

// TSVDecodeField is for the TSV record-reader.
func TSVDecodeField(input string) string {
	var buffer bytes.Buffer
	n := len(input)
	for i := 0; i < n; /* increment in loop */ {
		c := input[i]
		if c == '\\' && i < n-1 {
			d := input[i+1]
			if d == '\\' {
				buffer.WriteByte('\\')
				i += 2
			} else if d == 'n' {
				buffer.WriteByte('\n')
				i += 2
			} else if d == 'r' {
				buffer.WriteByte('\r')
				i += 2
			} else if d == 't' {
				buffer.WriteByte('\t')
				i += 2
			} else {
				buffer.WriteByte(c)
				i++
			}
		} else {
			buffer.WriteByte(c)
			i++
		}
	}
	return buffer.String()
}

// TSVEncodeField is for the TSV record-writer.
func TSVEncodeField(input string) string {
	var buffer bytes.Buffer
	for _, r := range input {
		if r == '\\' {
			buffer.WriteByte('\\')
			buffer.WriteByte('\\')
		} else if r == '\n' {
			buffer.WriteByte('\\')
			buffer.WriteByte('n')
		} else if r == '\r' {
			buffer.WriteByte('\\')
			buffer.WriteByte('r')
		} else if r == '\t' {
			buffer.WriteByte('\\')
			buffer.WriteByte('t')
		} else {
			buffer.WriteRune(r)
		}
	}
	return buffer.String()
}