在 csv 中聚合数据
Aggregating data in a csv
我必须生成一个 HTML 文件来显示我如何在 csv 文件中汇总数据。
这个文件的结构如下:
num_expediente;fecha;hora;localizacion;numero;cod_distrito;distrito;tipo_accidente;estado_meteorológico;tipo_vehiculo;tipo_persona;rango_edad;sexo;cod_lesividad;lesividad;coordenada_x_utm;coordenada_y_utm;positiva_alcohol;coste;positiva_droga
2022S000001;Enero;Noche;AVENIDA ALBUFERA;19;13;13_PUENTE DE VALLECAS;Choque;Despejado;Vehículo ligero;Conductor;<30;Mujer;0;Sin asistencia;443359,226;4472082,272;0;0;0
2022S000002;Enero;Noche;PLAZA CANOVAS DEL CASTILLO;2;3;3_RETIRO;Choque;Desconocido;Motocicleta;Conductor;31_60;Hombre;0;Sin asistencia;441155,351;4474129,588;1;0;0
2022S000003;Enero;Noche;CALLE SAN BERNARDO;53;1;1_CENTRO;Atropello;Despejado;Motocicleta;Conductor;Desconocido;Desconocido;0;Sin asistencia;439995,351;4475212,523;0;0;0
2022S000004;Enero;Noche;CALLE ALCALA;728;20;20_SAN BLAS-CANILLEJAS;Choque;Despejado;Vehículo ligero;Conductor;31_60;Hombre;2;Leve;449693,925;4477837,552;0;200;0
2022S000004;Enero;Noche;CALLE ALCALA;728;20;20_SAN BLAS-CANILLEJAS;Choque;Despejado;Vehículo ligero;Pasajero;31_60;Mujer;3;Grave;449693,925;4477837,552;0;3000;0
num_expediente是意外的id
fecha是出事的月份
sexo是事故隐含的人的性别
coste 是隐含的人的事故成本
我想创建一个 table 来显示每月的累计费用和性别。我使用这个脚本:
#! /usr/bin/awk -f
BEGIN {FS=OFS=";"}
function loop(array, name, i) {
for (i in array) {
if (isarray(array[i]))
loop(array[i], (name "[" i "]"))
else
printf("%s[%s] = %s\n",name, i, arr[i])
}
}
NR!=1{
array[][]+=
}
END {loop(array, "")
}
但输出并未汇总成本:
[Enero][Hombre] =
[Enero][Desconocido] =
[Enero][Mujer] =
[Febrero][Hombre] =
[Febrero][Mujer] =
[Febrero][Desconocido] =
[Marzo][Hombre] =
[Marzo][Desconocido] =
[Marzo][Mujer] =
我不知道为什么这不起作用。
我不知道如何从这个输出中生成 html。你也能帮忙吗?
如评论中所述,OP 在 printf
中有错字,其中 arr[i]
应为 array[i]
;虽然这应该可以解决 OP 当前的问题,但我不确定我是否理解递归函数调用的使用,除非 OP 的现实世界问题是处理不同维度的数组。
由于我们处理的是已知维度(即 2)的数组,因此简化了 awk
想法:
awk -F';' '
NR>1 { array[][]+= }
END { for (month in array)
for (gender in array[month])
printf "[%s][%s] = %s\n", month, gender, array[month][gender]
}
' raw.csv
对于提供的输入,生成:
[Enero][Hombre] = 200
[Enero][Desconocido] = 0
[Enero][Mujer] = 3000
备注:
- 此解决方案不解决 OP 可能对输出的任何排序要求
- 对于额外的排序要求,我建议 OP 首先解决当前问题,一旦解决,然后尝试应用额外的排序要求,然后...
- 如果排序有问题,请提出一个新问题(确保包括月份和性别的完整列表以及两个组件所需的排序顺序)
我必须生成一个 HTML 文件来显示我如何在 csv 文件中汇总数据。
这个文件的结构如下:
num_expediente;fecha;hora;localizacion;numero;cod_distrito;distrito;tipo_accidente;estado_meteorológico;tipo_vehiculo;tipo_persona;rango_edad;sexo;cod_lesividad;lesividad;coordenada_x_utm;coordenada_y_utm;positiva_alcohol;coste;positiva_droga
2022S000001;Enero;Noche;AVENIDA ALBUFERA;19;13;13_PUENTE DE VALLECAS;Choque;Despejado;Vehículo ligero;Conductor;<30;Mujer;0;Sin asistencia;443359,226;4472082,272;0;0;0
2022S000002;Enero;Noche;PLAZA CANOVAS DEL CASTILLO;2;3;3_RETIRO;Choque;Desconocido;Motocicleta;Conductor;31_60;Hombre;0;Sin asistencia;441155,351;4474129,588;1;0;0
2022S000003;Enero;Noche;CALLE SAN BERNARDO;53;1;1_CENTRO;Atropello;Despejado;Motocicleta;Conductor;Desconocido;Desconocido;0;Sin asistencia;439995,351;4475212,523;0;0;0
2022S000004;Enero;Noche;CALLE ALCALA;728;20;20_SAN BLAS-CANILLEJAS;Choque;Despejado;Vehículo ligero;Conductor;31_60;Hombre;2;Leve;449693,925;4477837,552;0;200;0
2022S000004;Enero;Noche;CALLE ALCALA;728;20;20_SAN BLAS-CANILLEJAS;Choque;Despejado;Vehículo ligero;Pasajero;31_60;Mujer;3;Grave;449693,925;4477837,552;0;3000;0
num_expediente是意外的id fecha是出事的月份 sexo是事故隐含的人的性别 coste 是隐含的人的事故成本
我想创建一个 table 来显示每月的累计费用和性别。我使用这个脚本:
#! /usr/bin/awk -f
BEGIN {FS=OFS=";"}
function loop(array, name, i) {
for (i in array) {
if (isarray(array[i]))
loop(array[i], (name "[" i "]"))
else
printf("%s[%s] = %s\n",name, i, arr[i])
}
}
NR!=1{
array[][]+=
}
END {loop(array, "")
}
但输出并未汇总成本:
[Enero][Hombre] =
[Enero][Desconocido] =
[Enero][Mujer] =
[Febrero][Hombre] =
[Febrero][Mujer] =
[Febrero][Desconocido] =
[Marzo][Hombre] =
[Marzo][Desconocido] =
[Marzo][Mujer] =
我不知道为什么这不起作用。 我不知道如何从这个输出中生成 html。你也能帮忙吗?
如评论中所述,OP 在 printf
中有错字,其中 arr[i]
应为 array[i]
;虽然这应该可以解决 OP 当前的问题,但我不确定我是否理解递归函数调用的使用,除非 OP 的现实世界问题是处理不同维度的数组。
由于我们处理的是已知维度(即 2)的数组,因此简化了 awk
想法:
awk -F';' '
NR>1 { array[][]+= }
END { for (month in array)
for (gender in array[month])
printf "[%s][%s] = %s\n", month, gender, array[month][gender]
}
' raw.csv
对于提供的输入,生成:
[Enero][Hombre] = 200
[Enero][Desconocido] = 0
[Enero][Mujer] = 3000
备注:
- 此解决方案不解决 OP 可能对输出的任何排序要求
- 对于额外的排序要求,我建议 OP 首先解决当前问题,一旦解决,然后尝试应用额外的排序要求,然后...
- 如果排序有问题,请提出一个新问题(确保包括月份和性别的完整列表以及两个组件所需的排序顺序)