bash - 在 bash 中解析包含异常字符、空格、括号和不规则返回的大型 CSV 文件

标签 bash csv awk sed grep

我有一个非常大(1.5 GB)的格式错误的 CSV 文件,我需要读入 R,虽然文件本身是 CSV,但由于行返回位置不当,分隔符在一定行数后会中断。

我有一个简化的示例 attached ,但是 truncated visual representation看起来像这样:

SubID,Date1,date2,var1,var2,broken_column_var
000000000,0000-00-00,0000-00-00,0,FIRST TEXT FOR ZERO,"[[ -0.00000000   0.00000000  -0.00000000  -0.00000000   0.00000000
   -0.00000000  -0.00000000   0.00000000   0.00000000   0.00000000
    0.00000000   0.00000000   0.00000000]
 [ -0.00000000  -0.0000000   -0.00000000  -0.00000000  -0.0000000
   -0.0000000   -0.0000000    0.00000000   0.00000000  -0.00000000
   -0.00000000   0.00000000   0.0000000 ]]"
000000000,1111-11-11,1111-11-11,1,SECOND TEXT FOR ZERO,"[[  1.11111111  -1.11111111  -1.1111111   -1.1111111    1.1111111
    1.11111111   1.11111111   1.11111111]]"
000000000,2222-22-22,2222-22-22,2,THIRD TEXT FOR ZERO,"[[-2.2222222   2.22222222 -2.22222222 -2.22222222  2.2222222  -2.22222222
  -2.22222222 -2.22222222 -2.22222222  2.22222222  2.22222222  2.22222222]
 [-2.22222222 -2.22222222  2.22222222  2.2222222   2.22222222 -2.22222222
   2.2222222  -2.2222222   2.22222222  2.2222222   2.222222   -2.22222222]
 [-2.22222222 -2.2222222   2.22222222  2.2222222   2.22222222 -2.22222222
  -2.22222222 -2.2222222  -2.22222222  2.22222222  2.2222222   2.22222222]
 [-2.22222222 -2.22222222  2.2222222   2.2222222   2.2222222  -2.22222222
  -2.222222   -2.2222222  -2.2222222  -2.22222222  2.22222222  2.2222222 ]
 [-2.22222222 -2.222222    2.22222222  2.22222222  2.22222222 -2.2222222
  -2.2222222  -2.2222222  -2.2222222  -2.22222222  2.22222222 -2.222222  ]
 [ 2.22222222 -2.22222222 -2.222222   -2.222222   -2.2222222  -2.22222222
  -2.222222   -2.22222222  2.2222222  -2.2222222   2.2222222   2.22222222]]"
111111111,0000-00-00,0000-00-00,00,FIRST TEXT FOR ONE,"[[ -0.00000000   0.00000000  -0.00000000   0.000000    -0.00000000
   -0.00000000   0.00000000   0.00000000]]"

CSV 中的新行和全部为/n。

为了避免将其全部加载到内存中并尝试在其他环境中将其解析为数据帧,我一直在尝试将相关片段从 CSV 打印到终端,删除字符返回、折叠空格并输入逗号-变量之间。

如下所示:

000000000,0000-00-00,0000-00-00,0,FIRST TEXT FOR ZERO,"[[-0.00000000,0.00000000,-0.00000000,-0.00000000,0.00000000,-0.00000000,-0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],[-0.00000000,-0.0000000,-0.00000000,-0.00000000,-0.0000000,-0.0000000,-0.0000000,0.00000000,0.00000000,-0.00000000,-0.00000000,0.00000000,0.0000000]]"

我的主要尝试是从括号和方括号之间的一行中提取所有信息:

awk '/\"\[\[/{found=1} found{print; if (/]]"/) exit}'  Malformed_csv_Abridged.csv | tr -d '\n\r' | tr -s ' ' | tr ' ' ','

输出:

000000000,0000-00-00,0000-00-00,0,FIRST,TEXT,FOR,ZERO,"[[,-0.00000000,0.00000000,-0.00000000,-0.00000000,0.00000000,-0.00000000,-0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],[,-0.00000000,-0.0000000,-0.00000000,-0.00000000,-0.0000000,-0.0000000,-0.0000000,0.00000000,0.00000000,-0.00000000,-0.00000000,0.00000000,0.0000000,]]"

接近了,但是:

  1. 打印第一个实例,因此我需要一种方法来查找其他实例。
  2. 它会在我要搜索的字符之前的空白处插入逗号 ("[[]]"),但我不需要这样做。
  3. 它在括号中留下了一些额外的逗号,由于必要的转义字符,我还没有找到正确的 tr 调用来将其删除。

最佳答案

我不明白你的目标。在我看来,CSV 文件是正确的 CSV 文件。 如果您只想删除换行符,可以使用 Millerclean-whitespace verb :

mlr --csv clean-whitespace Malformed.csv >Malformed_c.csv

获取此https://gist.githubusercontent.com/aborruso/538e964c0c84a8b27d4c3d3b61d23bb4/raw/1fa83f43238be4a6aeb9c743aaf2e4da36f6cc74/Malformed_c.csv

enter image description here

关于bash - 在 bash 中解析包含异常字符、空格、括号和不规则返回的大型 CSV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76376965/

相关文章:

matlab - 将带有文本限定符的 CSV 加载到 MATLAB/Octave

node.js - 如何在将 Json 转换为 CSV 时在 json2csv 库中提供自定义字段

linux-bash 从 csv 中读取数据并有条件地求和值

linux - 在 Clearcase 中查找最近的 checkout 并将文件路径提供给 xlsvtree 以查看文件历史记录

bash - 使用 AWK 组合三个文件的 Shell 脚本

linux - 创建一个 oneliner 来导入数据库

mysql - Bash - 在输出中获取循环的反向计数

bash - 具有可变隐藏根前缀的 Tcsh 和/或 bash 目录补全

bash - Vim - 在搜索时捕获字符串并在替换时使用

ruby - 我如何在 Debian 上使用带 Hudson CI 服务器的 RVM?