From 7d956c533e9fd7d3bbb9a4a8b7f89f0fe54d4bc3 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Sun, 13 Apr 2025 22:43:46 +0200 Subject: first draft --- contrib/csv-parser.py | 18 +++++++++ contrib/csv-parser.rb | 10 +++++ contrib/csv-perf.c | 46 +++++++++++++++++++++ contrib/csv-tutorial.c | 106 +++++++++++++++++++++++++++++++++++++++++++++++++ contrib/seq-read.c | 20 ++++++++++ 5 files changed, 200 insertions(+) create mode 100755 contrib/csv-parser.py create mode 100755 contrib/csv-parser.rb create mode 100644 contrib/csv-perf.c create mode 100644 contrib/csv-tutorial.c create mode 100644 contrib/seq-read.c (limited to 'contrib') diff --git a/contrib/csv-parser.py b/contrib/csv-parser.py new file mode 100755 index 0000000..9029321 --- /dev/null +++ b/contrib/csv-parser.py @@ -0,0 +1,18 @@ +#! /usr/local/bin/python3.7 + +import csv, time, sys + +with open(sys.argv[1]) as csv_file: + start = time.time() + csv_reader = csv.reader(csv_file, delimiter=',') + line_count = 0 + for row in csv_reader: + if line_count == 0: + line_count += 1 + else: + line_count += 1 + + end = time.time() + print(f'Processed {line_count} lines.') + print(end - start) + diff --git a/contrib/csv-parser.rb b/contrib/csv-parser.rb new file mode 100755 index 0000000..aaac877 --- /dev/null +++ b/contrib/csv-parser.rb @@ -0,0 +1,10 @@ +#! /usr/local/bin/ruby + +require 'csv' + +startTime = Time.now +CSV.read(ARGV[0]) +endTime = Time.now + +print(endTime-startTime) +puts "\n" diff --git a/contrib/csv-perf.c b/contrib/csv-perf.c new file mode 100644 index 0000000..1c0f7a3 --- /dev/null +++ b/contrib/csv-perf.c @@ -0,0 +1,46 @@ +#include +#include +#include +#include + +#include "csv.h" + +static int +test(FILE *f) +{ + int line = 0; + csv_t csv = { 0 }; + + while ( csv_read(&csv, f) ) { + ++line; + } + + return line; +} + +int +main(int argc, char *argv[]) +{ + if ( argc != 2 ) { + fprintf(stderr, "usage: %s testfile\n", argv[0]); + return EXIT_FAILURE; + } + + FILE *in = fopen(argv[1], "r"); + if ( in == NULL ) { + fprintf(stderr, "failed to open testfile...\n"); + return EXIT_FAILURE; + } + + clock_t start = clock(); + + int lines = test(in); + + clock_t end = clock(); + + fclose(in); + + printf("%d lines processed, duration: %.3lf sec\n", lines, ((double) (end - start)) / CLOCKS_PER_SEC); + + return EXIT_SUCCESS; +} diff --git a/contrib/csv-tutorial.c b/contrib/csv-tutorial.c new file mode 100644 index 0000000..9bdb7e6 --- /dev/null +++ b/contrib/csv-tutorial.c @@ -0,0 +1,106 @@ +#include +#include +#include +#include + +#include "csv.h" + +bool +processFile(const char *filename) +{ + FILE *in = fopen(filename, "r"); + + if ( in == NULL ) { + return false; + } + + csv_t csv; + csv_init(&csv); + + while ( csv_read(&csv, in) ) { + const size_t nfields = csv_nfields(&csv); + // ... + } + csv_cleanup(&csv); + + (void) fclose(in); + return true; +} + +bool +processFile_options(const char *filename) +{ + FILE *in = fopen(filename, "r"); + + if ( in == NULL ) { + return false; + } + + csv_options_t csv_options = csv_default_options; + csv_options.field_delimiter = '"'; + csv_options.field_separator = ','; + + csv_t csv; + csv_init_opt(&csv, &csv_options); + + while ( csv_read(&csv, in) ) { + const size_t nfields = csv_nfields(&csv); + // ... + } + csv_cleanup(&csv); + + (void) fclose(in); + return true; +} + +static void +csvErrorHandler(csv_err_t err, void *cb_arg) +{ + longjmp(*((jmp_buf *) cb_arg), err); +} + +bool +processFile_error(const char *filename) +{ + FILE *in = fopen(filename, "r"); + + if ( in == NULL ) { + return false; + } + + csv_options_t csv_options = csv_default_options; + csv_options.field_delimiter = '"'; + csv_options.field_separator = ','; + + jmp_buf env; + csv_options.cb_error = csvErrorHandler; + csv_options.cb_error_arg = &env; + + csv_t csv; + csv_init_opt(&csv, &csv_options); + + switch ( setjmp(env) ) { + case CSV_ERR_OK: + while ( csv_read(&csv, in) ) { + const size_t nfields = csv_nfields(&csv); + // ... + } + break; + + case CSV_ERR_OUT_OF_MEMORY: + case CSV_ERR_OUT_OF_RANGE: + case CSV_ERR_IO_READ: + case CSV_ERR_IO_WRITE: + csv_cleanup(&csv); + break; + } + + (void) fclose(in); + return true; +} + +int +main(void) +{ + return EXIT_SUCCESS; +} diff --git a/contrib/seq-read.c b/contrib/seq-read.c new file mode 100644 index 0000000..90d201f --- /dev/null +++ b/contrib/seq-read.c @@ -0,0 +1,20 @@ +#include +#include +#include + +int +main(void) +{ + clock_t start = clock(); + size_t sum = 0; + + for ( int ch; (ch = getc(stdin)) != EOF; ) { + sum += (unsigned char) ch; + } + + clock_t end = clock(); + + printf("Result: %zu, Duration: %.3lf sec\n", sum, ((double)(end - start)) / CLOCKS_PER_SEC); + + return EXIT_SUCCESS; +} -- cgit v1.3