Skip to content

Commit

Permalink
Merge pull request #271 from tomooda/master
Browse files Browse the repository at this point in the history
add more formatting options to DataFrameCsvWriter
  • Loading branch information
jecisc authored Jun 27, 2023
2 parents d40016b + 59a985b commit 3cdd6b5
Show file tree
Hide file tree
Showing 3 changed files with 159 additions and 11 deletions.
30 changes: 30 additions & 0 deletions src/DataFrame-IO-Tests/DataFrameCsvWriterTest.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,36 @@ DataFrameCsvWriterTest >> testWriteToCsvLineEndLf [
self assert: actual lines equals: expected lines
]

{ #category : #tests }
DataFrameCsvWriterTest >> testWriteToCsvWithRawFieldWriter [

| file writer actual expected |
file := FileSystem memory workingDirectory / 'testData' / 'raw.csv'.
file ensureCreateFile.
writer := DataFrameCsvWriter new.
writer useRawFieldWriter.
dataFrame writeTo: file using: writer.
actual := self readFile: file.
expected := TestCsvStrings commaCsvString.
self assert: actual lines equals: expected lines
]

{ #category : #tests }
DataFrameCsvWriterTest >> testWriteToCsvWithRawFieldWriterWithoutRowName [

| file writer actual expected |
file := FileSystem memory workingDirectory / 'testData' / 'raw.csv'.
file ensureCreateFile.
writer := DataFrameCsvWriter new.
writer
useRawFieldWriter;
disableRowName.
dataFrame writeTo: file using: writer.
actual := self readFile: file.
expected := TestCsvStrings commaCsvWithoutRowNameString.
self assert: actual lines equals: expected lines
]

{ #category : #tests }
DataFrameCsvWriterTest >> testWriteToCsvWithSeparatorTab [
| actual expected |
Expand Down
11 changes: 11 additions & 0 deletions src/DataFrame-IO-Tests/TestCsvStrings.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,17 @@ TestCsvStrings class >> commaCsvString [
'
]

{ #category : #running }
TestCsvStrings class >> commaCsvWithoutRowNameString [
^ 'temperature,precipitation,type
2.4,true,rain
0.5,true,rain
-1.2,true,snow
-2.3,false,-
3.2,true,rain
'
]

{ #category : #running }
TestCsvStrings class >> commaQuoteCsvString [
^ '"","temperature","precipitation","type"
Expand Down
129 changes: 118 additions & 11 deletions src/DataFrame-IO/DataFrameCsvWriter.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,19 @@ Class {
#superclass : #DataFrameWriter,
#instVars : [
'separator',
'lineEndConvention'
'lineEndConvention',
'fieldWriter',
'rowNameEnabled'
],
#category : #'DataFrame-IO-Core'
}

{ #category : #'accessing - field writers' }
DataFrameCsvWriter >> defaultFieldWriter [

^ nil
]

{ #category : #accessing }
DataFrameCsvWriter >> defaultLineEndConvention [
^ {
Expand All @@ -17,16 +25,49 @@ DataFrameCsvWriter >> defaultLineEndConvention [
} asDictionary at: Smalltalk os lineEnding
]

{ #category : #accessing }
DataFrameCsvWriter >> defaultRowIndexEnabled [

^ true
]

{ #category : #accessing }
DataFrameCsvWriter >> defaultSeparator [
^ $,
]

{ #category : #'enable/disable' }
DataFrameCsvWriter >> disableRowName [

self rowNameEnabled: false
]

{ #category : #'enable/disable' }
DataFrameCsvWriter >> enableRowName [

self rowNameEnabled: true
]

{ #category : #'accessing - field writers' }
DataFrameCsvWriter >> fieldWriter [

^ fieldWriter
]

{ #category : #'accessing - field writers' }
DataFrameCsvWriter >> fieldWriter: aSymbol [

fieldWriter := aSymbol
]

{ #category : #initialization }
DataFrameCsvWriter >> initialize [

super initialize.
separator := self defaultSeparator.
lineEndConvention := self defaultLineEndConvention
lineEndConvention := self defaultLineEndConvention.
fieldWriter := self defaultFieldWriter.
rowNameEnabled := self defaultRowIndexEnabled
]

{ #category : #accessing }
Expand All @@ -43,6 +84,42 @@ DataFrameCsvWriter >> lineEndConvention: aSymbol [
lineEndConvention := aSymbol
]

{ #category : #'accessing - field writers' }
DataFrameCsvWriter >> objectFieldWriter [

^ #object
]

{ #category : #'accessing - field writers' }
DataFrameCsvWriter >> optionalQuotedFieldWriter [

^ #optionalQuoted
]

{ #category : #'accessing - field writers' }
DataFrameCsvWriter >> quotedFieldWriter [

^ #quoted
]

{ #category : #'accessing - field writers' }
DataFrameCsvWriter >> rawFieldWriter [

^ #raw
]

{ #category : #accessing }
DataFrameCsvWriter >> rowNameEnabled [

^ rowNameEnabled
]

{ #category : #accessing }
DataFrameCsvWriter >> rowNameEnabled: aBoolean [

rowNameEnabled := aBoolean = true
]

{ #category : #accessing }
DataFrameCsvWriter >> separator [
^ separator
Expand All @@ -53,25 +130,55 @@ DataFrameCsvWriter >> separator: anObject [
separator := anObject
]

{ #category : #'accessing - field writers' }
DataFrameCsvWriter >> useObjectFieldWriter [

self fieldWriter: self objectFieldWriter
]

{ #category : #'accessing - field writers' }
DataFrameCsvWriter >> useOptionalQuotedFieldWriter [

self fieldWriter: self optionalQuotedFieldWriter
]

{ #category : #'accessing - field writers' }
DataFrameCsvWriter >> useQuotedFieldWriter [

self fieldWriter: self quotedFieldWriter
]

{ #category : #'accessing - field writers' }
DataFrameCsvWriter >> useRawFieldWriter [

self fieldWriter: self rawFieldWriter
]

{ #category : #writing }
DataFrameCsvWriter >> write: aDataFrame to: aFileReference [

| stream writer |
stream := aFileReference writeStream.

writer := NeoCSVWriter on: stream.
fieldWriter ifNotNil: [ writer fieldWriter: fieldWriter ].
writer separator: self separator.
writer lineEndConvention: self lineEndConvention.

writer
writeField: '';
writeSeparator;
writeHeader: aDataFrame columnNames.

aDataFrame do: [ :row |
self rowNameEnabled ifTrue: [
writer
writeField: row name;
writeSeparator;
nextPut: row ].
writeField: '';
writeSeparator ].
writer writeHeader: aDataFrame columnNames.

self rowNameEnabled
ifTrue: [
aDataFrame do: [ :row |
writer
writeField: row name;
writeSeparator;
nextPut: row ] ]
ifFalse: [ aDataFrame do: [ :row | writer nextPut: row ] ].

writer close
]

0 comments on commit 3cdd6b5

Please sign in to comment.