From 54bda32f967f2f379e457be2b51fdcc82476e59b Mon Sep 17 00:00:00 2001 From: axell-brendow Date: Sun, 7 Mar 2021 14:42:34 -0300 Subject: [PATCH 01/11] Cria struct Musica --- tps/fonte/musica.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 tps/fonte/musica.cpp diff --git a/tps/fonte/musica.cpp b/tps/fonte/musica.cpp new file mode 100644 index 0000000..5799e61 --- /dev/null +++ b/tps/fonte/musica.cpp @@ -0,0 +1,21 @@ +typedef struct { + char id[30]; + char name[200]; + char key[15]; + char artists[40][100]; + int num_artists; + char release_date[12]; + double acousticness; + double danceability; + double energy; + int duration_ms; + double instrumentalness; + double valence; + int popularity; + float tempo; + double liveness; + double loudness; + double speechiness; + int year; +} Musica; + From 9c1202785b940a772e4b5f1ef7559a0f66343e13 Mon Sep 17 00:00:00 2001 From: axell-brendow Date: Sun, 7 Mar 2021 14:44:32 -0300 Subject: [PATCH 02/11] =?UTF-8?q?Cria=20m=C3=A9todo=20para=20clonar=20uma?= =?UTF-8?q?=20m=C3=BAsica?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tps/fonte/musica.cpp | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tps/fonte/musica.cpp b/tps/fonte/musica.cpp index 5799e61..e2adaf8 100644 --- a/tps/fonte/musica.cpp +++ b/tps/fonte/musica.cpp @@ -19,3 +19,27 @@ typedef struct { int year; } Musica; +Musica clone_music(Musica *music) { + Musica clone; + strcpy(clone.id, music->id); + strcpy(clone.name, music->name); + strcpy(clone.key, music->key); + for (int i = 0; i < music->num_artists; i++) + strcpy(clone.artists[i], music->artists[i]); + clone.num_artists = music->num_artists; + strcpy(clone.release_date, music->release_date); + clone.acousticness = music->acousticness; + clone.danceability = music->danceability; + clone.energy = music->energy; + clone.duration_ms = music->duration_ms; + clone.instrumentalness = music->instrumentalness; + clone.valence = music->valence; + clone.popularity = music->popularity; + clone.tempo = music->tempo; + clone.liveness = music->liveness; + clone.loudness = music->loudness; + clone.speechiness = music->speechiness; + clone.year = music->year; + return clone; +} + From 3db8f977790438d2c22d6b57bcc51d3411f6d6fb Mon Sep 17 00:00:00 2001 From: axell-brendow Date: Sun, 7 Mar 2021 14:45:06 -0300 Subject: [PATCH 03/11] =?UTF-8?q?Melhora=20implementa=C3=A7=C3=A3o=20do=20?= =?UTF-8?q?clone=20de=20uma=20m=C3=BAsica?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tps/fonte/musica.cpp | 24 +++--------------------- 1 file changed, 3 insertions(+), 21 deletions(-) diff --git a/tps/fonte/musica.cpp b/tps/fonte/musica.cpp index e2adaf8..419e10f 100644 --- a/tps/fonte/musica.cpp +++ b/tps/fonte/musica.cpp @@ -20,26 +20,8 @@ typedef struct { } Musica; Musica clone_music(Musica *music) { - Musica clone; - strcpy(clone.id, music->id); - strcpy(clone.name, music->name); - strcpy(clone.key, music->key); - for (int i = 0; i < music->num_artists; i++) - strcpy(clone.artists[i], music->artists[i]); - clone.num_artists = music->num_artists; - strcpy(clone.release_date, music->release_date); - clone.acousticness = music->acousticness; - clone.danceability = music->danceability; - clone.energy = music->energy; - clone.duration_ms = music->duration_ms; - clone.instrumentalness = music->instrumentalness; - clone.valence = music->valence; - clone.popularity = music->popularity; - clone.tempo = music->tempo; - clone.liveness = music->liveness; - clone.loudness = music->loudness; - clone.speechiness = music->speechiness; - clone.year = music->year; - return clone; + return *music; +} + } From 5776c633707b3e7c21881191cae7035ed93a0b87 Mon Sep 17 00:00:00 2001 From: axell-brendow Date: Sun, 7 Mar 2021 14:47:50 -0300 Subject: [PATCH 04/11] =?UTF-8?q?Adiciona=20m=C3=A9todo=20para=20remover?= =?UTF-8?q?=20quebras=20de=20linha?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tps/fonte/musica.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tps/fonte/musica.cpp b/tps/fonte/musica.cpp index 419e10f..336e34a 100644 --- a/tps/fonte/musica.cpp +++ b/tps/fonte/musica.cpp @@ -1,3 +1,4 @@ +#include typedef struct { char id[30]; char name[200]; @@ -23,5 +24,17 @@ Musica clone_music(Musica *music) { return *music; } +char *remove_line_break(char line[]) { + int size = strlen(line); + + if (line[size - 2] == '\r') + line[size - 2] = '\0'; + + else if (line[size - 1] == '\r' || line[size - 1] == '\n') + line[size - 1] = '\0'; + + return line; +} + } From 4de8e742cd8f4794687243cae9d928d7a5c427d0 Mon Sep 17 00:00:00 2001 From: axell-brendow Date: Sun, 7 Mar 2021 14:49:25 -0300 Subject: [PATCH 05/11] =?UTF-8?q?Cria=20m=C3=A9todos=20para=20ler=20uma=20?= =?UTF-8?q?=C3=BAnica=20c=C3=A9lula=20de=20um=20CSV?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tps/fonte/musica.cpp | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/tps/fonte/musica.cpp b/tps/fonte/musica.cpp index 336e34a..3af88dd 100644 --- a/tps/fonte/musica.cpp +++ b/tps/fonte/musica.cpp @@ -36,5 +36,33 @@ char *remove_line_break(char line[]) { return line; } +char *read_quotted_csv_field(char *field_ptr, char *output) { + field_ptr++; + while (*field_ptr != '\0') { + if (*field_ptr == '"') { + if (*(field_ptr + 1) == '"') { + *output++ = '"'; + field_ptr += 2; + } else { + field_ptr++; + break; + } + } else { + *output++ = *field_ptr++; + } + } + *output = '\0'; + return field_ptr; +} + +char *read_csv_field(char *field_ptr, char *output) { + if (*field_ptr == '"') return read_quotted_csv_field(field_ptr, output); + + while (*field_ptr != '\0' && *field_ptr != ',') *output++ = *field_ptr++; + + *output = '\0'; + return field_ptr; +} + } From 7357bd2b21dedfda110b4fefff96734e985a18bc Mon Sep 17 00:00:00 2001 From: axell-brendow Date: Sun, 7 Mar 2021 14:50:00 -0300 Subject: [PATCH 06/11] =?UTF-8?q?Adiciona=20m=C3=A9todos=20para=20ler=20o?= =?UTF-8?q?=20campo=20artistas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tps/fonte/musica.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tps/fonte/musica.cpp b/tps/fonte/musica.cpp index 3af88dd..82b8ebb 100644 --- a/tps/fonte/musica.cpp +++ b/tps/fonte/musica.cpp @@ -64,5 +64,28 @@ char *read_csv_field(char *field_ptr, char *output) { return field_ptr; } +char *read_artist(char *output, char *artist_ptr) { + char delimiter = *artist_ptr++; + + while (*artist_ptr != delimiter) { + if (*artist_ptr == '\\') *output++ = *artist_ptr++; + *output++ = *artist_ptr++; + } + + *output = '\0'; + return artist_ptr + 1; +} + +void read_artists(Musica *music, char *artists_field) { + artists_field++; + int i = 0; + while (1) { + artists_field = read_artist(music->artists[i++], artists_field); + if (*artists_field == ']') break; + artists_field += 2; + } + music->num_artists = i; +} + } From 30b32f21e67116362e1a3edac291de92c61177e6 Mon Sep 17 00:00:00 2001 From: axell-brendow Date: Sun, 7 Mar 2021 14:50:53 -0300 Subject: [PATCH 07/11] =?UTF-8?q?Adiciona=20m=C3=A9todo=20para=20ler=20a?= =?UTF-8?q?=20data=20de=20lan=C3=A7amento?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tps/fonte/musica.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tps/fonte/musica.cpp b/tps/fonte/musica.cpp index 82b8ebb..918424b 100644 --- a/tps/fonte/musica.cpp +++ b/tps/fonte/musica.cpp @@ -87,5 +87,12 @@ void read_artists(Musica *music, char *artists_field) { music->num_artists = i; } +void read_release_date(Musica *music, char field[]) { + strcpy(music->release_date, field); + if (strlen(music->release_date) == 4) strcat(music->release_date, "/01/01"); + music->release_date[4] = '/'; + music->release_date[7] = '/'; +} + } From 2da851008a1d547f27594bd986a90381bd7fbc4a Mon Sep 17 00:00:00 2001 From: axell-brendow Date: Sun, 7 Mar 2021 14:53:27 -0300 Subject: [PATCH 08/11] =?UTF-8?q?Cria=20m=C3=A9todo=20para=20consertar=20a?= =?UTF-8?q?s=20porcentagens?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tps/fonte/musica.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tps/fonte/musica.cpp b/tps/fonte/musica.cpp index 918424b..feb0278 100644 --- a/tps/fonte/musica.cpp +++ b/tps/fonte/musica.cpp @@ -1,4 +1,5 @@ #include +#include typedef struct { char id[30]; char name[200]; @@ -94,5 +95,9 @@ void read_release_date(Musica *music, char field[]) { music->release_date[7] = '/'; } +double handle_percentage(double value) { + return ceil(value) == value ? value / 100 : value; +} + } From d99138741fb34a4cedb46bc0b577ee1efec4e0f1 Mon Sep 17 00:00:00 2001 From: axell-brendow Date: Sun, 7 Mar 2021 14:55:24 -0300 Subject: [PATCH 09/11] =?UTF-8?q?Cria=20m=C3=A9todo=20que=20l=C3=AA=20uma?= =?UTF-8?q?=20linha=20vinda=20do=20CSV=20e=20preenche=20a=20m=C3=BAsica?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tps/fonte/musica.cpp | 64 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/tps/fonte/musica.cpp b/tps/fonte/musica.cpp index feb0278..40310b2 100644 --- a/tps/fonte/musica.cpp +++ b/tps/fonte/musica.cpp @@ -1,5 +1,9 @@ +#include #include #include + +#define MAX_LINE_SIZE 860 + typedef struct { char id[30]; char name[200]; @@ -99,5 +103,65 @@ double handle_percentage(double value) { return ceil(value) == value ? value / 100 : value; } +void read_music(Musica *music, char line[]) { + char field[MAX_LINE_SIZE]; + remove_line_break(line); + + line = read_csv_field(line, field); + music->valence = handle_percentage(atof(field)); + + line = read_csv_field(line + 1, field); + music->year = atoi(field); + + line = read_csv_field(line + 1, field); + music->acousticness = handle_percentage(atof(field)); + + line = read_csv_field(line + 1, field); + read_artists(music, field); + + line = read_csv_field(line + 1, field); + music->danceability = handle_percentage(atof(field)); + + line = read_csv_field(line + 1, field); + music->duration_ms = atoi(field); + + line = read_csv_field(line + 1, field); + music->energy = handle_percentage(atof(field)); + + line = read_csv_field(line + 1, field); // Skip 'explicit' column + + line = read_csv_field(line + 1, field); + strcpy(music->id, field); + + line = read_csv_field(line + 1, field); + music->instrumentalness = handle_percentage(atof(field)); + + line = read_csv_field(line + 1, field); + strcpy(music->key, field); + + line = read_csv_field(line + 1, field); + music->liveness = handle_percentage(atof(field)); + + line = read_csv_field(line + 1, field); + music->loudness = atof(field); + + line = read_csv_field(line + 1, field); // Skip 'mode' column + + line = read_csv_field(line + 1, field); + strcpy(music->name, field); + + line = read_csv_field(line + 1, field); + music->popularity = atoi(field); + + line = read_csv_field(line + 1, field); + read_release_date(music, field); + + line = read_csv_field(line + 1, field); + music->speechiness = handle_percentage(atof(field)); + + line = read_csv_field(line + 1, field); + music->tempo = atof(field); +} + } From be02f2343a29dc30816a3913bfb7e115f7472313 Mon Sep 17 00:00:00 2001 From: axell-brendow Date: Sun, 7 Mar 2021 14:56:21 -0300 Subject: [PATCH 10/11] =?UTF-8?q?Cria=20os=20m=C3=A9todos=20para=20imprimi?= =?UTF-8?q?r=20uma=20m=C3=BAsica?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tps/fonte/musica.cpp | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/tps/fonte/musica.cpp b/tps/fonte/musica.cpp index 40310b2..a05f5c8 100644 --- a/tps/fonte/musica.cpp +++ b/tps/fonte/musica.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -163,5 +164,39 @@ void read_music(Musica *music, char line[]) { music->tempo = atof(field); } +void print_artists(Musica *music) { + printf("["); + + if (music->num_artists > 0) { + printf("%s", music->artists[0]); + + for (int i = 1; i < music->num_artists; i++) + printf(", %s", music->artists[i]); + } + + printf("]"); } +void print_music(Musica *music) { + printf("%s ## ", music->id); + print_artists(music); + printf(" ## %s ## %c%c/%c%c/%c%c%c%c ## %G ## %G ## %G ## %G ## %G ## %G ## %G ## %d\n", + music->name, + music->release_date[8], + music->release_date[9], + music->release_date[5], + music->release_date[6], + music->release_date[0], + music->release_date[1], + music->release_date[2], + music->release_date[3], + music->acousticness, + music->danceability, + music->instrumentalness, + music->liveness, + music->loudness, + music->speechiness, + music->energy, + music->duration_ms + ); +} From c92c27d00507f39595ddf7496b02d5f2617fb7aa Mon Sep 17 00:00:00 2001 From: axell-brendow Date: Sun, 7 Mar 2021 15:24:29 -0300 Subject: [PATCH 11/11] =?UTF-8?q?Adiciona=20coment=C3=A1rios=20de=20docume?= =?UTF-8?q?nta=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tps/fonte/musica.cpp | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tps/fonte/musica.cpp b/tps/fonte/musica.cpp index a05f5c8..82cd9c0 100644 --- a/tps/fonte/musica.cpp +++ b/tps/fonte/musica.cpp @@ -61,6 +61,15 @@ char *read_quotted_csv_field(char *field_ptr, char *output) { return field_ptr; } +/** + * @brief Lê uma única célula de um CSV. + * + * @param field_ptr Ponteiro para o primeiro caractere dessa célula. + * @param output Arranjo que receberá o conteúdo da célula. + * + * @return Ponteiro que aponta para uma posição depois da célula. + * Geralmente um ponteiro para uma vírgula ou o fim da linha. + */ char *read_csv_field(char *field_ptr, char *output) { if (*field_ptr == '"') return read_quotted_csv_field(field_ptr, output); @@ -82,6 +91,13 @@ char *read_artist(char *output, char *artist_ptr) { return artist_ptr + 1; } +/** + * @brief Lê o campo artists de uma música e preenche o arranjo de artistas dela. + * + * @param music Ponteiro para a struct da música. + * @param artists_field Ponteiro para o primeiro caractere do campo artists. + * Um colchete '[' em todos os casos. + */ void read_artists(Musica *music, char *artists_field) { artists_field++; int i = 0; @@ -104,6 +120,14 @@ double handle_percentage(double value) { return ceil(value) == value ? value / 100 : value; } +/** + * @brief Lê uma linha vinda do CSV e preenche os campos da Música. + * + * @param music Ponteiro para a struct da música. + * @param line Linha do CSV. + * + * Ex.: read_music(&music, "0.598,2018,0.136,\"['Royce Da 5\\'9""', 'Eminem', 'King Green']\",0.706,283077,0.745,1,6LZe8JfVaqcpq8yjkHtWQe,0.0,10,0.268,-5.97,0,Caterpillar (feat. Eminem & King Green),61,2018-05-04,0.441,91.08") + */ void read_music(Musica *music, char line[]) { char field[MAX_LINE_SIZE]; remove_line_break(line);