Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,12 @@ gen.json
extract_metadata
test_sav_date
test_double_decimals
dump_sas7bdat
generate_corpus
*.csv
*.json
!resources/csv_to_sas7bdat.csv
!resources/csv_to_sas7bdat.json
*.py
*.tar.gz
*.zip
Expand Down
18 changes: 17 additions & 1 deletion Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,11 @@ EXTRA_DIST = \
resources/compression_type_0x0d.sas7bdat \
resources/format_with_default_32bit.sas7bcat \
resources/format_with_default_64bit.sas7bcat \
resources/sav_missing_continuations.sav
resources/sav_missing_continuations.sav \
resources/csv_to_sas7bdat.csv \
resources/csv_to_sas7bdat.json \
resources/csv_to_sas7bdat.expected \
src/test/test_csv_to_sas7bdat.sh

include_HEADERS = src/readstat.h

Expand Down Expand Up @@ -137,6 +141,7 @@ noinst_HEADERS = \
src/bin/read_csv/mod_csv.h \
src/bin/read_csv/mod_dta.h \
src/bin/read_csv/mod_sav.h \
src/bin/read_csv/mod_sas7bdat.h \
src/bin/read_csv/read_csv.h \
src/bin/read_csv/read_module.h \
src/bin/read_csv/value.h \
Expand Down Expand Up @@ -177,6 +182,7 @@ readstat_SOURCES = \
src/bin/read_csv/mod_csv.c \
src/bin/read_csv/mod_dta.c \
src/bin/read_csv/mod_sav.c \
src/bin/read_csv/mod_sas7bdat.c \
src/bin/read_csv/value.c \
src/bin/write/double_decimals.c \
src/bin/write/mod_csv.c \
Expand Down Expand Up @@ -260,6 +266,16 @@ test_double_decimals_CFLAGS = -g -Wall @EXTRA_WARNINGS@ -Werror -pedantic-errors

TESTS = test_readstat test_dta_days test_sav_date test_double_decimals

if HAVE_CSVREADER
check_PROGRAMS += dump_sas7bdat

dump_sas7bdat_SOURCES = src/test/dump_sas7bdat.c
dump_sas7bdat_LDADD = libreadstat.la
dump_sas7bdat_CFLAGS = -Wall @EXTRA_WARNINGS@ -Werror -pedantic-errors -std=c99

TESTS += src/test/test_csv_to_sas7bdat.sh
endif

EXTRA_PROGRAMS = \
generate_corpus

Expand Down
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,9 @@ CSV input is supported together with a metadata file describing the data:

readstat <input file.csv> <input metadata.json> <output file>

The `<output file>` should end with `.dta`, `.sav`, or `.csv`.
The `<output file>` should end with `.dta`, `.sav`, `.sas7bdat`, or `.csv`.
A `.sas7bdat` file cannot hold value labels, which SAS keeps in a separate
catalog, so any `categories` in the metadata are not written to it.

The `<input file.csv>` is a regular CSV file.

Expand Down
2 changes: 2 additions & 0 deletions VS17/ReadStat_App/ReadStat_App.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
<ClCompile Include="..\..\src\bin\read_csv\mod_csv.c" />
<ClCompile Include="..\..\src\bin\read_csv\mod_dta.c" />
<ClCompile Include="..\..\src\bin\read_csv\mod_sav.c" />
<ClCompile Include="..\..\src\bin\read_csv\mod_sas7bdat.c" />
<ClCompile Include="..\..\src\bin\read_csv\value.c" />
<ClCompile Include="..\..\src\bin\util\readstat_dta_days.c" />
<ClCompile Include="..\..\src\bin\util\readstat_sav_date.c" />
Expand All @@ -43,6 +44,7 @@
<ClInclude Include="..\..\src\bin\read_csv\mod_csv.h" />
<ClInclude Include="..\..\src\bin\read_csv\mod_dta.h" />
<ClInclude Include="..\..\src\bin\read_csv\mod_sav.h" />
<ClInclude Include="..\..\src\bin\read_csv\mod_sas7bdat.h" />
<ClInclude Include="..\..\src\bin\read_csv\read_csv.h" />
<ClInclude Include="..\..\src\bin\read_csv\read_module.h" />
<ClInclude Include="..\..\src\bin\read_csv\value.h" />
Expand Down
6 changes: 6 additions & 0 deletions VS17/ReadStat_App/ReadStat_App.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,9 @@
<ClCompile Include="..\..\src\bin\read_csv\mod_sav.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\src\bin\read_csv\mod_sas7bdat.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\src\bin\read_csv\value.c">
<Filter>Source Files</Filter>
</ClCompile>
Expand Down Expand Up @@ -95,6 +98,9 @@
<ClInclude Include="..\..\src\bin\read_csv\mod_sav.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\..\src\bin\read_csv\mod_sas7bdat.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\..\src\bin\read_csv\read_csv.h">
<Filter>Header Files</Filter>
</ClInclude>
Expand Down
5 changes: 5 additions & 0 deletions resources/csv_to_sas7bdat.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
id,amount,pct,score,born,stamp,clock,name
1,12.5,25,3,2020-02-29,2020-02-29 13:45:30.250,08:15:00,Zoë
2,,50,-9,1959-12-31,1960-01-01T00:00:01,23:59:59.5,
3,-0.75,,999,,2016-12-31 23:59:59,,"a, b"
4,1e3,100,7,1960-01-01,,00:00:00,plain
40 changes: 40 additions & 0 deletions resources/csv_to_sas7bdat.expected
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
variable id format=BEST12. label=Identifier
variable amount format=F12.2 label=
variable pct format=F11.1 label=
variable score format=BEST12. label=
variable born format=DATE9. label=
variable stamp format=DATETIME19. label=
variable clock format=TIME8. label=
variable name format= label=Name
0 id 1
0 amount 12.5
0 pct 25
0 score 3
0 born 21974
0 stamp 1898603130.25
0 clock 29700
0 name "Zoë"
1 id 2
1 amount .
1 pct 50
1 score .A
1 born .A
1 stamp 1
1 clock 86399.5
1 name ""
2 id 3
2 amount -0.75
2 pct .
2 score .B
2 born .
2 stamp 1798847999
2 clock .
2 name "a, b"
3 id 4
3 amount 1000
3 pct 100
3 score 7
3 born 0
3 stamp .
3 clock 0
3 name "plain"
11 changes: 11 additions & 0 deletions resources/csv_to_sas7bdat.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{"type": "SAS", "variables": [
{"type": "NUMERIC", "name": "id", "label": "Identifier"},
{"type": "NUMERIC", "name": "amount", "format": "CURRENCY", "decimals": 2},
{"type": "NUMERIC", "name": "pct", "format": "PERCENT", "decimals": 1},
{"type": "NUMERIC", "name": "score", "missing": {"type": "DISCRETE", "values": [-9, 999]},
"categories": [{"code": 3, "label": "Three"}]},
{"type": "NUMERIC", "name": "born", "format": "DATE", "missing": {"type": "RANGE", "low": "1959-01-01", "high": "1959-12-31"}},
{"type": "NUMERIC", "name": "stamp", "format": "DATE_TIME"},
{"type": "NUMERIC", "name": "clock", "format": "TIME"},
{"type": "STRING", "name": "name", "label": "Name"}
]}
Loading
Loading