有没有办法分离包含数据和时间的列的数据文件中的列

时间:2018-04-19 17:18:11

标签: c database import

所以我导入的数据文件包含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()另一种选择吗?

有没有办法可以有效地做到这一点,因为我将每个列存储到数组中然后我为每个数组都有一个搜索函数,搜索包含字符串的数组会很麻烦。

2 个答案:

答案 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)

您可以使用fgetsstrtoksscanf来解析文件。

  • 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
}