Skip to content

Commit 30f59a9

Browse files
committed
add fieldWriter and rowNameEnabled to CSV writer
1 parent 9f5628a commit 30f59a9

3 files changed

Lines changed: 159 additions & 11 deletions

File tree

src/DataFrame-IO-Tests/DataFrameCsvWriterTest.class.st

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,36 @@ DataFrameCsvWriterTest >> testWriteToCsvLineEndLf [
5555
self assert: actual lines equals: expected lines
5656
]
5757

58+
{ #category : #tests }
59+
DataFrameCsvWriterTest >> testWriteToCsvWithRawFieldWriter [
60+
61+
| file writer actual expected |
62+
file := FileSystem memory workingDirectory / 'testData' / 'raw.csv'.
63+
file ensureCreateFile.
64+
writer := DataFrameCsvWriter new.
65+
writer useRawFieldWriter.
66+
dataFrame writeTo: file using: writer.
67+
actual := self readFile: file.
68+
expected := TestCsvStrings commaCsvString.
69+
self assert: actual lines equals: expected lines
70+
]
71+
72+
{ #category : #tests }
73+
DataFrameCsvWriterTest >> testWriteToCsvWithRawFieldWriterWithoutRowName [
74+
75+
| file writer actual expected |
76+
file := FileSystem memory workingDirectory / 'testData' / 'raw.csv'.
77+
file ensureCreateFile.
78+
writer := DataFrameCsvWriter new.
79+
writer
80+
useRawFieldWriter;
81+
disableRowName.
82+
dataFrame writeTo: file using: writer.
83+
actual := self readFile: file.
84+
expected := TestCsvStrings commaCsvWithoutRowNameString.
85+
self assert: actual lines equals: expected lines
86+
]
87+
5888
{ #category : #tests }
5989
DataFrameCsvWriterTest >> testWriteToCsvWithSeparatorTab [
6090
| actual expected |

src/DataFrame-IO-Tests/TestCsvStrings.class.st

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,17 @@ TestCsvStrings class >> commaCsvString [
1515
'
1616
]
1717

18+
{ #category : #running }
19+
TestCsvStrings class >> commaCsvWithoutRowNameString [
20+
^ 'temperature,precipitation,type
21+
2.4,true,rain
22+
0.5,true,rain
23+
-1.2,true,snow
24+
-2.3,false,-
25+
3.2,true,rain
26+
'
27+
]
28+
1829
{ #category : #running }
1930
TestCsvStrings class >> commaQuoteCsvString [
2031
^ '"","temperature","precipitation","type"

src/DataFrame-IO/DataFrameCsvWriter.class.st

Lines changed: 118 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,19 @@ Class {
33
#superclass : #DataFrameWriter,
44
#instVars : [
55
'separator',
6-
'lineEndConvention'
6+
'lineEndConvention',
7+
'fieldWriter',
8+
'rowNameEnabled'
79
],
810
#category : #'DataFrame-IO-Core'
911
}
1012

13+
{ #category : #'accessing - field writers' }
14+
DataFrameCsvWriter >> defaultFieldWriter [
15+
16+
^ nil
17+
]
18+
1119
{ #category : #accessing }
1220
DataFrameCsvWriter >> defaultLineEndConvention [
1321
^ {
@@ -17,16 +25,49 @@ DataFrameCsvWriter >> defaultLineEndConvention [
1725
} asDictionary at: Smalltalk os lineEnding
1826
]
1927

28+
{ #category : #accessing }
29+
DataFrameCsvWriter >> defaultRowIndexEnabled [
30+
31+
^ true
32+
]
33+
2034
{ #category : #accessing }
2135
DataFrameCsvWriter >> defaultSeparator [
2236
^ $,
2337
]
2438

39+
{ #category : #'enable/disable' }
40+
DataFrameCsvWriter >> disableRowName [
41+
42+
self rowNameEnabled: false
43+
]
44+
45+
{ #category : #'enable/disable' }
46+
DataFrameCsvWriter >> enableRowName [
47+
48+
self rowNameEnabled: true
49+
]
50+
51+
{ #category : #'accessing - field writers' }
52+
DataFrameCsvWriter >> fieldWriter [
53+
54+
^ fieldWriter
55+
]
56+
57+
{ #category : #'accessing - field writers' }
58+
DataFrameCsvWriter >> fieldWriter: aSymbol [
59+
60+
fieldWriter := aSymbol
61+
]
62+
2563
{ #category : #initialization }
2664
DataFrameCsvWriter >> initialize [
65+
2766
super initialize.
2867
separator := self defaultSeparator.
29-
lineEndConvention := self defaultLineEndConvention
68+
lineEndConvention := self defaultLineEndConvention.
69+
fieldWriter := self defaultFieldWriter.
70+
rowNameEnabled := self defaultRowIndexEnabled
3071
]
3172

3273
{ #category : #accessing }
@@ -43,6 +84,42 @@ DataFrameCsvWriter >> lineEndConvention: aSymbol [
4384
lineEndConvention := aSymbol
4485
]
4586

87+
{ #category : #'accessing - field writers' }
88+
DataFrameCsvWriter >> objectFieldWriter [
89+
90+
^ #object
91+
]
92+
93+
{ #category : #'accessing - field writers' }
94+
DataFrameCsvWriter >> optionalQuotedFieldWriter [
95+
96+
^ #optionalQuoted
97+
]
98+
99+
{ #category : #'accessing - field writers' }
100+
DataFrameCsvWriter >> quotedFieldWriter [
101+
102+
^ #quoted
103+
]
104+
105+
{ #category : #'accessing - field writers' }
106+
DataFrameCsvWriter >> rawFieldWriter [
107+
108+
^ #raw
109+
]
110+
111+
{ #category : #accessing }
112+
DataFrameCsvWriter >> rowNameEnabled [
113+
114+
^ rowNameEnabled
115+
]
116+
117+
{ #category : #accessing }
118+
DataFrameCsvWriter >> rowNameEnabled: aBoolean [
119+
120+
rowNameEnabled := aBoolean = true
121+
]
122+
46123
{ #category : #accessing }
47124
DataFrameCsvWriter >> separator [
48125
^ separator
@@ -53,25 +130,55 @@ DataFrameCsvWriter >> separator: anObject [
53130
separator := anObject
54131
]
55132

133+
{ #category : #'accessing - field writers' }
134+
DataFrameCsvWriter >> useObjectFieldWriter [
135+
136+
self fieldWriter: self objectFieldWriter
137+
]
138+
139+
{ #category : #'accessing - field writers' }
140+
DataFrameCsvWriter >> useOptionalQuotedFieldWriter [
141+
142+
self fieldWriter: self optionalQuotedFieldWriter
143+
]
144+
145+
{ #category : #'accessing - field writers' }
146+
DataFrameCsvWriter >> useQuotedFieldWriter [
147+
148+
self fieldWriter: self quotedFieldWriter
149+
]
150+
151+
{ #category : #'accessing - field writers' }
152+
DataFrameCsvWriter >> useRawFieldWriter [
153+
154+
self fieldWriter: self rawFieldWriter
155+
]
156+
56157
{ #category : #writing }
57158
DataFrameCsvWriter >> write: aDataFrame to: aFileReference [
159+
58160
| stream writer |
59161
stream := aFileReference writeStream.
60162

61163
writer := NeoCSVWriter on: stream.
164+
fieldWriter ifNotNil: [ writer fieldWriter: fieldWriter ].
62165
writer separator: self separator.
63166
writer lineEndConvention: self lineEndConvention.
64167

65-
writer
66-
writeField: '';
67-
writeSeparator;
68-
writeHeader: aDataFrame columnNames.
69-
70-
aDataFrame do: [ :row |
168+
self rowNameEnabled ifTrue: [
71169
writer
72-
writeField: row name;
73-
writeSeparator;
74-
nextPut: row ].
170+
writeField: '';
171+
writeSeparator ].
172+
writer writeHeader: aDataFrame columnNames.
173+
174+
self rowNameEnabled
175+
ifTrue: [
176+
aDataFrame do: [ :row |
177+
writer
178+
writeField: row name;
179+
writeSeparator;
180+
nextPut: row ] ]
181+
ifFalse: [ aDataFrame do: [ :row | writer nextPut: row ] ].
75182

76183
writer close
77184
]

0 commit comments

Comments
 (0)