所以我导入的数据文件包含5列,例如
1992-01-25T00:00:30.000Z | 0.718 | -0.758 | -0.429 | 1.129
我知道scanf()
允许您指定正在扫描的数据类型,例如%s
和%f
。但我的问题是第一列我希望scanf
将它作为数字或将该列分成两列,如1992-01-25 | 00:00:30.000。使用fgets()
另一种选择吗?
有没有办法可以有效地做到这一点,因为我将每个列存储到数组中然后我为每个数组都有一个搜索函数,搜索包含字符串的数组会很麻烦。
答案 0 :(得分:1)
如果我是你,我会在解析文件后创建一个包含数据表的结构。
typedef struct {
int num_rows;
char table[MAX_NUM_ROWS][MAX_NUM_COLS][MAX_COL_LEN];
} YOUR_DATA;
您应该使用fgets
逐行解析该文件。首先将'T'上的线标记,然后在'|'上标记它,就像这样
FILE your_fp;
YOUR_DATA yourTable;
char line[MAX_ROW_LEN] = {0};
char *ptr = NULL, field = NULL;
int row = 0, col = 0;
if ((your_fp = fopen("datafile.txt", "r")) == NULL) {
//error
}
while(fgets(line, sizeof(line), your_fp) != NULL) {
ptr = line;
col = 0;
if ((field = strsep(&ptr, "T")) != NULL) {
snprintf(yourTable.table[row][col], MAX_COL_LEN, "%s", field);
col++;
}
while ((field = strsep(&ptr, "|")) != NULL) {
snprintf(yourTable.table[row][col], MAX_COL_LEN, "%s", field);
col++;
}
row++
}
可能希望跟踪表格中的行数等。您可以担心尝试将它们转换为正确的数据类型。
答案 1 :(得分:1)
您可以使用fgets
,strtok
和sscanf
来解析文件。
fgets
从文件中读取一行strtok
使用|
作为分隔符sscanf
解析子字符串以将每个子字符串转换为数字在下面的示例代码中,日期字段合并为一个整数。例如,
“1992-01-25”成为十进制数19920125
。合并时间字段,以便最终结果表示从午夜开始的毫秒数。
bool parseFile(FILE *fpin)
{
char line[256];
while (fgets(line, sizeof(line), fpin) != NULL)
{
// get the date/time portion of the line
char *dateToken = strtok(line, "|");
// extract the floating point values from the line
float value[4];
for (int i = 0; i < 4; i++)
{
char *token = strtok(NULL, "|");
if (token == NULL)
return false;
if (sscanf(token, "%f", &value[i]) != 1)
return false;
}
// extract the components of the date and time
int year, month, day, hour, minute, second, millisec;
char t, z;
sscanf(dateToken, "%d-%d-%d%c%d:%d:%d.%d%c",
&year, &month, &day, &t,
&hour, &minute, &second, &millisec, &z);
// combine the components into a single number for the date and time
int date = year * 10000 + month * 100 + day;
int time = hour * 3600000 + minute * 60000 + second * 1000 + millisec;
// display the parsed information
printf("%d %d", date, time);
for (int i = 0; i < 4; i++)
printf(" %6.3f", value[i]);
printf("\n");
}
return true; // the file was successfully parsed
}