我有一个非常大(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,]]"
接近了,但是:
- 它仅打印第一个实例,因此我需要一种方法来查找其他实例。
- 它会在我要搜索的字符之前的空白处插入逗号 (
"[[]]"
),但我不需要这样做。 - 它在括号中留下了一些额外的逗号,由于必要的转义字符,我还没有找到正确的
tr
调用来将其删除。
最佳答案
我不明白你的目标。在我看来,CSV 文件是正确的 CSV 文件。 如果您只想删除换行符,可以使用 Miller和 clean-whitespace verb :
mlr --csv clean-whitespace Malformed.csv >Malformed_c.csv
关于bash - 在 bash 中解析包含异常字符、空格、括号和不规则返回的大型 CSV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76376965/