如何在J语言中删除CSV数据的日期列 已有CSV读入J代码参考
J语言批量删除CSV指定列实现方案
你现有已实现的CSV读入函数 rdtabfile =: (0&";.;.2@:(TAB&,)@:});._2) @ ReadFile @< 可将目标CSV读取为二维数值数组,后续操作基于该函数的输出结构实现。
核心实现步骤
J语言中二维数组删除指定列可通过转置+索引过滤的方式实现,操作流程如下:
- 步骤1:定义待删除的列索引,注意J采用0基索引规则,第1列对应索引0,第2列对应索引1,以此类推,示例如下(如果要删除多个列,直接在数组中追加对应索引即可):
DEL_COLS =: 2 NB. 示例:删除第3列(0基索引2)的日期列
- 步骤2:定义列过滤逻辑,对读入的二维数组执行列删除操作:
' arr为rdtabfile读入的二维数值数组 ' clean_arr =: |: (|: arr) #~ -. (i. # |: arr) e. DEL_COLS
代码说明:先将数组转置,行和列互换,过滤掉对应索引的行之后再转置回原结构,即可得到删除指定列后的数组。
- 步骤3:定义CSV写回函数,将处理后的数组写入新文件(避免覆盖原文件):
wrtabfile =: dyad : 0 data =. x out_path =. y row_str =. (;@:(<@:(,'\n'&,)@:(TAB&join)))"1 data row_str fwrite out_path )
- 步骤4:批量处理指定目录下所有CSV文件:
process_all =: monad : 0 ' 读取当前目录所有csv文件 ' csv_list =. 1&take every > (dir '*.csv') for_fn. csv_list do. arr =. rdtabfile for_fn if. 0 = # arr do. continue end. ' 执行列删除 ' clean_arr =. |: (|: arr) #~ -. (i. # |: arr) e. DEL_COLS ' 生成输出文件名,追加_clean后缀 ' out_fn =. ('.csv' stringreplace for_fn; '_clean.csv') clean_arr wrtabfile out_fn end. ) ' 启动批量处理 ' process_all ''
注意事项
如果你的CSV包含表头(首行为列名),现有
rdtabfile会尝试将表头转成数值导致报错,你需要先调整读入函数跳过首行单独处理表头,将表头和处理后的数组合并后再写回文件。
如果日期列为字符串格式无法被转成数值,你需要先修改rdtabfile支持混合类型数据读取,再执行列删除操作。
内容的提问来源于stack exchange,提问作者Abdool Bhollah
相关产品推荐
相关产品推荐

