首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当分隔符可能缺失时,我如何用DataFrame读取CSV.read中的文件?

当分隔符可能缺失时,我如何用DataFrame读取CSV.read中的文件?
EN

Stack Overflow用户
提问于 2022-06-19 14:59:12
回答 1查看 195关注 0票数 2

我有一堆文件(*.pdb文件由AlphaFold生成,供那些在生物/生命科学领域工作的人使用),我想读到朱莉娅的DataFrames中。

它们通常只有1000行,如下所示:

代码语言:javascript
复制
MODEL     1                                                                     
ATOM      1  N   MET B   1      21.976 -98.993 -39.513  1.00 27.24           N  
ATOM      2  CA  MET B   1      23.354 -99.175 -39.063  1.00 27.24           C  
ATOM      3  C   MET B   1      23.767 -98.056 -38.113  1.00 27.24           C  
ATOM      4  CB  MET B   1      24.308 -99.226 -40.258  1.00 27.24           C  
ATOM      5  O   MET B   1      23.315 -96.918 -38.253  1.00 27.24           O  
ATOM      6  CG  MET B   1      24.512-100.624 -40.820  1.00 27.24           C  

我用空格分隔符使用CSV.read将它们读入CSV.read,并忽略了它们;

代码语言:javascript
复制
headers = ["Type", "Index", "Atom", "Amino acid type", "Chain", "Amino acid number", "Position X", "Position Y", "Position Z", "Something", "pIDDT", "Atom type"]
types = Dict(:"Type"=>String, :"Index"=>Int64, :"Atom"=>String, :"Amino acid type"=>String, :"Chain"=>Char, :"Amino acid number"=>Int64, :"Position X"=>Float64, :"Position Y"=>Float64, :"Position Z"=>Float64, :"Something"=>Float64, :"pIDDT"=>Float64, :"Atom type"=>Char)
df = CSV.read(file, DataFrame; header=headers, skipto=2, delim=' ', ignorerepeated=true, types=types)

问题是在某些行中,空格“缺失”。在上面示例文件的最后一行中,第7列和第8列之间没有空格,因为值I列8 (-100.624)占据了前面的空间。

这样做的结果如下所示,行(现在是第6行)被抵消,缺少一些数据:

代码语言:javascript
复制
Row │ Type    Index   Atom     Amino acid type  Chain  Amino acid number  Position X   Position Y  Position Z  Something  pIDDT       Atom type 
     │ String  Int64?  String?  String?          Char?  Int64?             Float64?     Float64?    Float64?    Float64?   Float64?    Char?     
─────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
   1 │ ATOM         1  N        MET              B                      1       21.976     -98.993     -39.513       1.0        27.24  N
   2 │ ATOM         2  CA       MET              B                      1       23.354     -99.175     -39.063       1.0        27.24  C
   3 │ ATOM         3  C        MET              B                      1       23.767     -98.056     -38.113       1.0        27.24  C
   4 │ ATOM         4  CB       MET              B                      1       24.308     -99.226     -40.258       1.0        27.24  C
   5 │ ATOM         5  O        MET              B                      1       23.315     -96.918     -38.253       1.0        27.24  O
   6 │ ATOM         6  CG       MET              B                      1  missing         -40.82        1.0        27.24  missing     missing   

我正在考虑对文件进行预格式化(一行一行,如果前面没有空白的-,添加空白),但是有更好的方法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-19 21:34:05

对于CSV.jl,我认为没有比预先格式化更好的解决方案了。但是,由于您的文件很小,您可能只需执行以下操作(因此,预格式化是作为RAM中的预处理步骤完成的):

代码语言:javascript
复制
io = replace(read(file, String), r"(\d)-" => s"\1 -") |> IOBuffer
df = CSV.read(io, DataFrame; header=headers, skipto=2, delim=' ', ignorerepeated=true, types=types)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72677923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档