如何在首元素为空时正确读取文件中的列(Julia)
解决方案:加载对齐格式数据为指定矩阵
问题描述
现有数据文件data.txt,内容如下:
a 5 b 3 c 7
希望将其加载为如下3×3矩阵:
3×3 Matrix{Any}: "" "a" "" 5 "b" "" 3 "c" 7
使用DelimitedFiles.readdlm时,会将首行的"a"识别为第一个元素,无法保留首列的空值;使用readlines读取行后,不知道如何处理空元素的识别。
方法一:手动处理行数据
利用readlines读取所有行后,根据每行的元素数量补全空字段,并转换数据类型:
# 读取文件所有行 lines = readlines("data.txt") # 处理每行,补全空字段 processed_lines = map(lines) do line # 拆分非连续空格分隔的元素 elems = split(strip(line), r"\s+") # 根据元素数补全对应位置的空值 length(elems) == 1 ? ["", elems[1], ""] : length(elems) == 2 ? [elems[1], elems[2], ""] : elems end # 转换为矩阵 loaded_data = hcat(processed_lines...)' |> collect # 将可转换为整数的字符串转为数值类型 for i in eachindex(loaded_data) try loaded_data[i] = parse(Int, loaded_data[i]) catch # 转换失败则保留原字符串 end end
运行后即可得到目标矩阵。
方法二:使用固定宽度文件专用包(FixedWidthFiles)
如果数据是严格按列宽对齐的,推荐使用FixedWidthFiles包处理,更准确可靠:
- 安装包:
using Pkg Pkg.add("FixedWidthFiles")
- 定义列宽格式并读取:
using FixedWidthFiles # 定义各列的位置范围(根据实际数据调整) schema = FixedWidthSchema( (col1, String, 1:2), # 第一列占第1-2个字符 (col2, String, 3:4), # 第二列占第3-4个字符 (col3, String, 5:6) # 第三列占第5-6个字符 ) # 读取固定宽度文件 df = read_fwf("data.txt", schema) # 转换为矩阵并处理空值和数据类型 loaded_data = Matrix(df) for i in eachindex(loaded_data) stripped_str = strip(loaded_data[i]) loaded_data[i] = isempty(stripped_str) ? "" : tryparse(Int, stripped_str) |> something(stripped_str) end
这种方法更适合结构化的固定宽度数据,避免手动判断元素位置的误差。
内容的提问来源于stack exchange,提问作者Bebotron
相关产品推荐
相关产品推荐

