C语言中将逗号换行分隔字符串高效转换为二维数组的方法
高效转换CSV格式字符串为二维数组的方案
你原来的思路需要多次遍历字符串统计行列数,确实存在优化空间,仅需一次遍历即可完成全部转换,时间复杂度为O(n)(n为字符串总长度),不需要提前预分配固定容量的数组,用动态容器暂存内容即可,具体实现逻辑如下:
- 初始化3个临时容器:外层
结果数组存储所有行数据、内层当前行数组存储正在处理的单行元素、临时字符缓存存储正在拼接的单个元素内容 - 从左到右逐个遍历字符串的每一个字符:
- 遇到逗号
,时:将临时字符缓存的内容作为单个元素推入当前行数组,清空临时字符缓存 - 遇到换行符
\n时:先将临时字符缓存的内容推入当前行数组,再将整个当前行数组推入结果数组,同时清空临时字符缓存和当前行数组 - 普通字符直接追加到临时字符缓存末尾
- 遇到逗号
- 遍历结束后执行收尾操作:将剩余的临时字符缓存内容推入当前行数组,再将当前行数组推入结果数组(处理最后一行末尾没有换行符的情况)
- 如果需要将元素转换为数值等其他类型,可在元素推入数组时同步完成,无需额外遍历
以下是Python语言的实现示例:
def str_to_2d_array(input_str: str) -> list: result = [] current_row = [] current_item_buffer = [] for char in input_str: if char == ",": current_row.append("".join(current_item_buffer)) current_item_buffer.clear() elif char == "\n": current_row.append("".join(current_item_buffer)) result.append(current_row.copy()) current_item_buffer.clear() current_row.clear() else: current_item_buffer.append(char) # 处理最后一行的剩余内容 if current_item_buffer or current_row: current_row.append("".join(current_item_buffer)) result.append(current_row) return result # 测试用例 test_str = "A,B,C\n1,2,3\n,4,9,6" print(str_to_2d_array(test_str)) # 输出结果:[['A', 'B', 'C'], ['1', '2', '3'], ['', '4', '9', '6']]
如果使用的是C++、Java等强类型语言,要求最终输出固定大小的二维数组,也可以在单次遍历过程中同步统计行数和最大列数,遍历完成后直接用暂存的元素生成固定数组即可,最多仅需一次遍历,比先统计维度再填充的方案效率更高。
内容的提问来源于stack exchange,提问作者Ortal Cohen
相关产品推荐
相关产品推荐

