【问题标题】:Reading wrong number of '\n' from csv file从 csv 文件中读取错误数量的 '\n'
【发布时间】:2014-01-07 19:10:26
【问题描述】:

函数读取 csv 文件,用空字符替换分隔符并计算列数和换行符,但返回错误的 '\n' 数,我不知道为什么?请帮忙!

代码末尾附近的注释:应该是 24643 - 实际是 24687

示例数据:我在必要时手动添加了“,”分隔符以显示列更改。

Product,23659,LAUX431GDS X431,图形诊断扫描工具,P,LAUX431GDS,CANDO INTERNATIONAL,权利,OE 级访问国内、欧洲和亚洲制造商,用于读取/清除代码、实时数据绘图和记录定向测试和模块编码(将提供用于 4 通道示波器、点火分析仪、传感器模拟器和万用表的单独模块)

  • 所有车辆系统及其模块的诊断访问和通信速度无与伦比。启用 Wifi,让您可以访问您喜爱的网站以获取故障排除建议、图表和维修信息。
  • 一键更新,一次更新一条或多条车线
  • 无需连接到 PC 进行更新,所有补丁和软件更新都直接通过您订阅每年更新工具。
  • 包括第一年的更新
        int getCurrentData(FILE *current){
    
        int totalChars = 0, colCount = 0, productCount = 0;
        char *buffer = NULL, next = '\0';
        size_t i = 0;
    
        fseek(current, 0, SEEK_END);
        size_t fileSize = ftell(current);
        rewind(current);
    
        buffer = malloc(fileSize);
        fread(buffer, fileSize, 1, current);
    
        /*replacing delimiter with null character*/
        for (i = 0; i < fileSize; i++){
            if (buffer[i] == ',' && buffer[i+1] != ' '){
                buffer[i] = '\0';
            }
        }
        /*finds column and product count*/
        for (i = 0; i < fileSize; i++){
            if (buffer[i] == '\0' && productCount == 0 || buffer[i] == '\n' && productCount == 0){
                colCount++;
            }
            if (buffer[i] == '\n' && i < fileSize){
                productCount++;                         /*should be 24643 - actual 24687*/
            }
        }
    
        return productCount;
    }
    
  • 【问题讨论】:

    • 为什么你认为数字应该不同?
    • 一个问题是您假设您从文件中读取的缓冲区将包含值EOF
    • 可能,fileSize 不正确。
    • 为了澄清您的问题:您是说当文件中只有 24643 行时此代码返回 24687?它比实际有 44 更多 行?
    • 您的“应该”是 24643,“实际”是 24687。24687 来自您的代码。您是如何确定 24643 的?如果这是 Excel 中的行数,请注意一个单元格可以有多行。

    标签: c file-io fread


    【解决方案1】:

    问题数量

    1. 主要问题是替换分隔符循环可能会将\n 替换为\0

    2. 次要:long fileSize 应为 size_t fileSize

    3. if (next != EOF){ 应该被删除。

    4. 次要:buffer = malloc(fileSize + 1); 应为 buffer = malloc(fileSize);

    5. 替换循环搞砸了

      size_t fileSize = ftell(current);
      ...
      buffer = malloc(fileSize);           // later add error checking
      fread(buffer, fileSize, 1, current); // later add error checking
      /*replacing delimiter with null character*/
      for (size_t i = 0; i < fileSize; i++){
        if (buffer[i] == ',') {
          // Not sure why OP has (buffer[i+1] != ' ')?  Maybe \n was originally meant
          if ((i+1) >= filesize) || ((buffer[i+1] != ' ') && (buffer[i+1] != '\n'))) {
            buffer[i] = '\0';
          // Or rather than the above if(), maybe something simple:
          buffer[i] = '\0';
          }
        }
      }  
      

    代码未测试 - 抱歉没有足够的时间。

    【讨论】:

    • 我使用 (ch == ',' && next != ' ') 因为 csv 数据中有逗号。这是我知道如何分隔分隔符和 csv 数据的唯一方法。此外,我已经修复了您提到的问题 2,3 和 4,但仍然得到不正确的 \n 数量。还有其他想法吗??谢谢!
    • @TinMan 指定 delimiter 到底是什么意思?逗号、空格、某种组合还是其他?
    • @TinMan 包含逗号的 CSV 数据是否具有区分属性 - 例如用引号 ('"') 括起来?您的具有挑战性的 CSV 数据的一些示例行怎么样?
    • 分隔符只是一个逗号后面没有空格,我现在贴一些数据。
    猜你喜欢
    • 2012-06-17
    • 2018-10-15
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    相关资源
    最近更新 更多