讲师中心 微信公众号
AI工具推荐 视频效率加速

c++怎么在读取CSV时自动过滤掉符合特定业务逻辑条件的非法行【实战】

老墨大大_4385

老墨大大_4385

发布时间:2026-03-31 15:24:12

|

869人浏览过

|

来源于php中文网

原创

应使用std::getline逐行读取后按业务规则校验,再用状态机解析字段;非法行多因引号处理不当导致切分错误,须先校验再转换类型。

c++怎么在读取csv时自动过滤掉符合特定业务逻辑条件的非法行【实战】

用 std::getline 逐行读取再判断,别碰正则或第三方CSV库

CSV不是结构化格式,C++标准库没有原生CSV解析器。强行用 std::stringstream 按逗号切分会崩在带引号、换行、转义逗号的字段里。真实业务中,非法行往往不是语法错误(如列数不对),而是语义违规——比如金额为负、日期早于2020年、ID重复。所以必须先完整读一行字符串,再按业务规则检查,合法才解析字段。

实操建议:

立即学习“C++免费学习笔记(深入)”;

  • 用 std::getline 从 std::ifstream 逐行读入 std::string,不跳过任何字符(包括空行和纯空白行)
  • 对每行做轻量预检:空行、首字符是 #(注释)、长度超限(防恶意长行)直接跳过
  • 业务校验逻辑写成独立函数,例如 bool is_valid_row(const std::string& line),返回 false 就 continue
  • 别在读取时就调用 split 或 csv::parse —— 非法行根本不需要解析字段

字段分割必须用状态机,不能靠 find(',') + substr

CSV字段可能含逗号,只要被双引号包裹就算一个字段;引号本身还可能被转义("" 表示一个引号)。用简单字符串查找必然切错,导致列数错位、业务校验跑偏。你看到的“非法行”,八成是字段切歪后,把金额字段当成了字符串字段去比大小。

实操建议:

立即学习“C++免费学习笔记(深入)”;

  • 手写一个极简状态机:三个状态(OUTSIDE_QUOTE、INSIDE_QUOTE、AFTER_QUOTE),只关心引号和逗号
  • 遇到未被引号包裹的逗号才切分;引号内的逗号一律忽略
  • 发现 "" 要合并为单个 ",否则后续字符串比较会失败(比如校验 "N/A" 时多了一个引号)
  • 如果某行引号不成对,视为格式错误,直接标记为非法,不进业务逻辑

业务条件校验要放在字段解析后、数据转换前

字段切出来是字符串,但业务条件往往基于类型值:比如“年龄 > 0 且 int 再判断,遇到非数字字段(如空字符串、N/A)会触发 std::stoi 异常或返回 0,掩盖真实问题。更糟的是,有些字段允许空,但空值在业务上等价于默认值(如 discount=0.0),这些都要显式处理。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

实操建议:

立即学习“C++免费学习笔记(深入)”;

  • 先用 std::vector<:string></:string> 存原始字段,不做任何转换
  • 按字段索引查业务规则:第2列是金额 → 调用 parse_money(field[1]),该函数返回 std::optional<double></double>,失败即非法
  • 空字符串、全空白、NULL、N/A 等约定值,统一由解析函数识别并转为 std::nullopt 或默认值
  • 所有数值比较前,确保 has_value() 为真;否则整行丢弃

性能关键点:别让 std::string 反复拷贝

大CSV文件(百万行以上)里,每行都构造新 std::string、再切出一堆子串,内存分配开销远超业务逻辑本身。尤其当你用 substr 得到字段时,它默认深拷贝——哪怕你只是想比对前缀或检查是否为空。

实操建议:

立即学习“C++免费学习笔记(深入)”;

  • 读行用 std::string line; line.reserve(4096); 预分配,避免反复扩容
  • 字段切分时,存 std::string_view(C++17)而非 std::string,所有校验函数改用 const std::string_view& 入参
  • 只有真正需要修改或长期持有字段内容时(比如存入容器),才调用 to_string()
  • 用 line.empty() 和 field.empty() 判断空,别用 == "" —— 前者是 O(1),后者可能触发临时对象构造

最易被忽略的是引号处理边界:状态机漏掉结尾引号、没处理连续两个引号、或者把字段末尾空格误判为分隔符。这些不会报错,但会让某几行“看似合法”实则字段错位,业务数据悄悄污染。上线前一定拿含引号、逗号、换行的真实样本测满三遍。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

7219

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1698

2024.03.01

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2398

2023.09.20

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

847

2025.10.24

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1878

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

3044

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6304

2023.10.24

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

0

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn