danieljon.es

index posts opinions likes dislikes interesting cgit github

Posts

My posts about programming and things.
Date format is day/month/year because I'm sane.

simple csv parse

30/10/2019

I store purchases I make in a spreadsheet. The spreadsheet is becoming a pain to use so I am creating a program to store them in a database and prettyprint purchases.

The first piece needed was to parse the csv output of the spreadsheet, I did this with a simple C program:

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct purchase
{
	char *product;
	char *website;
	char *date;
	char *cost;
	char *notes;
};

void
parsepurchase(struct purchase *p, char *line)
{
	char *modline;
	char *bup;
	size_t linesize;
	size_t len;
	linesize = strlen(line);
	modline = malloc(linesize + 1);
	bup = modline;
	strcpy(modline, line);
	modline = strtok(modline, ",\"");

	p->product = malloc(strlen(modline) + 1);
	strcpy(p->product, modline);

	modline = strtok(NULL, ",\"");
	p->website = malloc(strlen(modline) + 1);
	strcpy(p->website, modline);

	modline = strtok(NULL, ",\"");
	p->date = malloc(strlen(modline) + 1);
	strcpy(p->date, modline);

	modline = strtok(NULL, ",\"");
	p->cost = malloc(strlen(modline) + 1);
	strcpy(p->cost, modline);

	modline = strtok(NULL, ",\"");
	p->notes = malloc(strlen(modline) + 1);
	strcpy(p->notes, modline);

	/* remove unwanted newline when note exists */
	len = strlen(p->notes) - 1;
	if (p->notes[len] == '\n')
		p->notes[len] = '\0';

	printf("%s, %s, %s, %s, %s\n",
			p->product,
			p->website,
			p->date,
			p->cost,
			p->notes);
	free(bup);
}

void
freepurchases(struct purchase *purchases, size_t count)
{
	size_t i = 0;
	while (i != count)
	{
		free(purchases[i].product);
		free(purchases[i].website);
		free(purchases[i].date);
		free(purchases[i].cost);
		free(purchases[i].notes);
		i++;
	}
}

int
main(int argc, char **argv)
{
	FILE *file;
	struct purchase purchases[512]; /* max 512 entries for now */
	char *line;
	size_t len;
	ssize_t read;
	int i;

	if (argc != 2)
	{
		printf("use: %s csvfile\n", argv[0]);
	}


	file = fopen(argv[1], "r");
	if (!file)
	{
		fprintf(stderr, "unable to open csv file\n");
		exit(EXIT_FAILURE);
	}

	line = NULL;
	len = 0;
	i = 0;

	while ((read = getline(&line, &len, file)) != -1)
	{
		parsepurchase(&purchases[i], line);
		i++;
	}

	freepurchases(purchases, i);
	fclose(file);
	free(line);
	return EXIT_SUCCESS;
}



FSF member

page generated 11-12-2019 23:02:24 using sitegenerator