有一个csv数据表,第一列为编号,第二列为数据,编写C语言代码实现按照相同的编号,对第数据进行整理,相同编号的数据放在同一行
时间: 2024-11-18 19:16:08 浏览: 21
福岛第一核电站核废水数据集 CSV(1029条记录)【500010045】
5星 · 资源好评率100%
好的,我可以帮助你编写一个C语言程序来实现这个功能。假设你的CSV文件名为`data.csv`,并且数据格式如下:
```
编号,数据
1,A
2,B
1,C
3,D
2,E
```
你希望输出的结果是:
```
1,A,C
2,B,E
3,D
```
下面是一个示例代码,它读取CSV文件并按照相同的编号整理数据:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LINE_LENGTH 1024
#define MAX_IDS 100
#define MAX_DATA_PER_ID 100
typedef struct {
int id;
char data[MAX_DATA_PER_ID][MAX_LINE_LENGTH];
int data_count;
} IDData;
void add_data(IDData *id_data, int id, const char *data) {
for (int i = 0; i < id_data->data_count; i++) {
if (id_data[i].id == id) {
strcpy(id_data[i].data[id_data[i].data_count], data);
id_data[i].data_count++;
return;
}
}
id_data[id_data->data_count].id = id;
strcpy(id_data[id_data->data_count].data[0], data);
id_data[id_data->data_count].data_count = 1;
id_data->data_count++;
}
int main() {
FILE *file = fopen("data.csv", "r");
if (!file) {
perror("Unable to open file");
return EXIT_FAILURE;
}
char line[MAX_LINE_LENGTH];
fgets(line, sizeof(line), file); // Skip header line
IDData id_data[MAX_IDS] = {0};
int id_data_count = 0;
while (fgets(line, sizeof(line), file)) {
int id;
char data[MAX_LINE_LENGTH];
if (sscanf(line, "%d,%[^\n]", &id, data) == 2) {
add_data(id_data, id, data);
} else {
fprintf(stderr, "Invalid line format: %s\n", line);
}
}
fclose(file);
for (int i = 0; i < id_data_count; i++) {
printf("%d", id_data[i].id);
for (int j = 0; j < id_data[i].data_count; j++) {
printf(",%s", id_data[i].data[j]);
}
printf("\n");
}
return EXIT_SUCCESS;
}
```
### 解释:
1. **结构体定义**:我们定义了一个结构体 `IDData` 来存储每个编号及其对应的数据。
2. **添加数据函数**:`add_data` 函数用于将数据添加到相应的编号中。如果编号已经存在,则直接添加数据;否则,创建一个新的编号条目。
3. **主函数**:在主函数中,我们打开CSV文件并逐行读取数据。对于每一行,我们解析出编号和数据,然后调用 `add_data` 函数将其添加到适当的位置。最后,我们遍历所有编号并打印结果。
请确保你的CSV文件路径正确,并且文件格式符合预期。你可以根据需要调整代码中的常量值(如 `MAX_LINE_LENGTH`, `MAX_IDS`, `MAX_DATA_PER_ID`)以适应更大的数据集。
阅读全文