CSV解析

一直以为csv靠逗号(,)分割数据,那么只要用str.spilt(',',row)便可以将数据分割开。

事实证明想简单了,csv里还有这样的规定,如果数据内有双引号(")和逗号(,)那么,数据就要用双引号括起来,而双引号要替换两个双引号。

比如说数据是: hello,world,那么他在csv里应该表达为:"hello,world"

数据是: say "hello",那么他在csv里就应该是"say ""hello"""

这样就使得解析的时候没法直接用split函数。

根据规则解析应该符合以下状态图:

(有些字倒,将就看吧)

那么使用python实现便是:

class CsvInterpreter:_lines = {"0": {"quot": ("1", False), "other": ("2", True)},"1": {"other": ("1", True), "quot": ("3", False), "comma": ("1", True)},"2": {"other": ("2", True), "comma": ("0", False), "enter": ("4", False)},"3": {"quot": ("1", True), "comma": ("0", False), "enter": ("4", False)},"5": {"comma": ("0", False), "enter": ("4", False)}}def _init(self):self._chars = ""self._current_status = "0"self._buffer = ""self._container = []def __init__(self):self._buffer = Noneself._chars = Noneself._container = Noneself._current_status = Noneself._init()def _next(self, char: str) -> None:if char == '"':cond = "quot"elif char == ',':cond = "comma"elif char == '\n':cond = "enter"else:cond = "other"if cond not in self._lines[self._current_status]:raise ValueError("格式不正确", self._chars, self._container, self._buffer, self._current_status, cond, char)else:next_status, if_input = self._lines[self._current_status][cond]self._current_status = next_statusif if_input:self._buffer += chardef split(self, line: str) -> list:self._init()self._chars = linefor char in line:self._next(char)if self._current_status in ["0", "4"]:self._container.append(self._buffer)self._buffer = ""if self._current_status == "4":return self._containerif self._current_status not in ["3", "4"]:raise ValueError("格式不正确")self._container.append(self._buffer)return self._container

运行:

csv_interpreter = CsvInterpreter()
with open('*.csv','r',encoding='utf-8') as f:for line in f.readlines():row = csv_interpreter.split(line)print(row)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/635906.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面向对象(封装,继承,多态)

1.封装【encapsulation】 【/ɪnˌkpsjuˈleɪʃ(ə)n/】 在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。 封装可以被认为是一个保护屏障,防止该…

基于Zookeeper 简单实现分布式任务协调组件

优质博文:IT-BLOG-CN 一、什么是 Zookeeper ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。 它是一个为分布式应用提供一致性服务的软件,提…

苍穹外卖day1--开发环境搭建

整体结构 前端:管理端(Web) 用户端(小程序) 后端:后端服务(Java) 前端工程基于ngnix运行 启动nginx:双击nginx.exe即可启动nginx服务,访问端口号为80 后端…

【数字电路与系统】【北京航空航天大学】实验:时序逻辑设计——三色灯开关(二)、需求分析和系统设计

本次实验(一)见博客:【数字电路与系统】【北京航空航天大学】实验:时序逻辑设计——三色灯开关(一)、实验指导书 说明:本次实验的代码使用verilog编写,文章中为阅读方便&#xff0c…

C#使用AnimateWindow()实现动画窗体的方法:创建特殊窗体

目录 一.涉及到的知识点 (1) AnimateWindow函数 (2)操作流程 1.首先,定义一个用于封装AnimateWindow函数的类 2.在窗体类中使用这个方法 3.生成效果 二、实例 (1)Resources.Designer.cs…

C++|stack-queue-priority_queue(适配器+模拟实现+仿函数)

目录 一、容器适配器 1.1容器适配器概念的介绍 1.2stack和queue的底层结构 1.3deque容器的介绍 1.3.1deque的缺陷及为何选择他作为stack和queue的底层默认实现 二、stack的介绍和使用 2.1stack的介绍 2.2stack的使用 2.3stack的模拟实现 三、queue的介绍和使用 …

LLMs之Llama3:Llama 3的简介、安装和使用方法、案例应用之详细攻略

LLMs之Llama3:Llama 3的简介、安装和使用方法、案例应用之详细攻略 导读:2024年4月18日,Meta 重磅推出了Meta Llama 3,本文章主要介绍了Meta推出的新的开源大语言模型Meta Llama 3。模型架构 Llama 3 是一种自回归语言模型&#x…

蓝桥杯第十五界软件测试线下省赛题目分析及解决

PS 需要第十五界蓝桥杯被测系统或者功能测试模板、单元测试被测代码、自动化测试被测代码请加🐧:1940787338 备注:15界蓝桥杯省赛软件测试 题目1:功能测试 题目描述 ​ 某物流公司的货运收费标准根据重量、距离和节假日三个因素来确定。如…

2024蓝桥杯嵌入式模板代码详解

文章目录 一、STM32CubeMx配置二、LED模板代码三、LCD模板代码 一、STM32CubeMx配置 打开STM32CubeMx,选择【File】->【New Project】,进入芯片选择界面,搜索到蓝桥杯官方的芯片型号,并点击收藏,下次直接点击收藏就…

LeetCode 113—— 路径总和 II

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 看到树的问题一般我们先考虑一下是否能用递归来做。 假设 root 节点的值为 value,如果根节点的左子树有一个路径总和等于 targetSum - value,那么只需要将根节点的值插入到这个路径列表中…

Unity之圆环slider

一、参考文章 Unity_圆环滑动条(圆形、弧形滑动条)_unity弧形滑动条-CSDN博客 此滑动条拖动超过360后继续往前滑动值会从0开始,正常我们超过360度时不可在滑动。 二、 超过360度不可滑动问题解决 参考HTML文章制作: https://www.c…

嵌入式Linux开发

(17 封私信 / 1 条消息) 嵌入式Linux应用 - 搜索结果 - 知乎 (zhihu.com)