File: TabFileReader.sc

package info (click to toggle)
supercollider 1%3A3.13.0%2Brepack-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 80,292 kB
  • sloc: cpp: 476,363; lisp: 84,680; ansic: 77,685; sh: 25,509; python: 7,909; makefile: 3,440; perl: 1,964; javascript: 974; xml: 826; java: 677; yacc: 314; lex: 175; objc: 152; ruby: 136
file content (84 lines) | stat: -rw-r--r-- 2,060 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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
FileReader : Stream {
	// a class to read text files automatically
	classvar <delim = $ ;	// space separated by default
	var <stream, skipEmptyLines = false, skipBlanks = false, <delimiter;

	*new { |pathOrFile, skipEmptyLines = false, skipBlanks = false, delimiter|
		var stream;
		if(pathOrFile.respondsTo(\getChar) ) {
			stream = pathOrFile
		} {
			stream = File(pathOrFile, "r");
			if(stream.isOpen.not) {
				warn(this.name ++ ": file" + pathOrFile + "not found.");
				^nil
			};
		};
		^super.newCopyArgs(stream, skipEmptyLines, skipBlanks,  delimiter ? this.delim)
	}

	reset { stream.reset }

	// CollStream doesn't implement 'close'
	// but is legal to use with readers otherwise
	close { stream.tryPerform(\close) }

	next {
		var c, record, string = String.new;
		while {
			c = stream.getChar;
			c.notNil
		} {
			if (c == delimiter) {
				if (skipBlanks.not or: { string.size > 0 }) {
					record = record.add(string);
					string = String.new;
				}
			} {
				if (c == $\n or: { c == $\r }) {
					record = record.add(string);
					string = String.new;
					if (skipEmptyLines.not or: { (record != [ "" ]) }) {
						^record
					};
					record = nil;
				}{
					string = string.add(c);
				}
			}
		};
		if (string.notEmpty) { ^record.add(string) };
		^record;
	}

	read { ^this.all }

	*read { | path, skipEmptyLines=false, skipBlanks=false, func, delimiter, startRow = 0, skipSize = 0 |
		var fr, table;
		fr = this.new(path, skipEmptyLines, skipBlanks,  delimiter) ?? { ^nil };

		if (func.notNil) {
			table = fr.subSample(startRow, skipSize).collect(_.collect(func)).all;
		} {
			table = fr.subSample(startRow, skipSize).all;
		};
		fr.close;
		^table
	}

	*readInterpret { | path, skipEmptyLines=false, skipBlanks=false, delimiter, startRow = 0, skipSize = 0  |
		^this.read(path, skipEmptyLines, skipBlanks, _.interpret, delimiter, startRow, skipSize )	}

}

TabFileReader : FileReader {
	classvar <delim = $\t;
}

CSVFileReader : FileReader {
	classvar <delim = $,;
}

SemiColonFileReader : FileReader {
	classvar <delim = $;;
}