2021-03-17 在linux上将vcf文件转plink的格式bed,bim,fam

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-03-17 在linux上将vcf文件转plink的格式bed,bim,fam相关的知识,希望对你有一定的参考价值。

参考技术A 我现在的问题是这样的
vcf文件转plink的格式
方法一
vcftools

出错这样

方法二plink

都是一样的结果

就无语
之前我的文件有这些

现在是这些

然后看到了这些

然后发现文件又是临时文件

说明又出错了
所以,现在或许又要解决那一行的无效染色体
然后我就使用了--allow-extra-chr

哈,又回到了最初的起点

可是我看意思,plink2不应该有这个问题啊

应该是 --vcf-half-call的格式不对
然后换回plink1
重看官网
以及 https://www.jianshu.com/p/38e603979334?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation
发现格式

发现原来是因为少了空格

终于成功,哭了
https://www.jianshu.com/p/dc82fcbe3cda 然后意识到自己搜索关键词有问题

这回终于对了

但问题是第一种转的,不知道应该是哪一种

手机联系人批量导入(字符编码xls转vcf)

一、前言

单位同事每人都办理了一个192新手机号,一打过来不知道是谁,又懒的一个个保存姓名。一想是不是可以批量导入呢?电子表格号码名单我有啊,试试吧。

二、实践

1.先下载手机联系人文件看看吧。在手机联系人设置中有个导出选项(华为手机为例):

 导出文件为00001.vcf,用文本编辑强行打开,是一个个卡片:

 2.下载VCF编辑软件试试。

 这一款(A款),居然打不开vcf文件,不咋地。

 

 这一款(B款),可以读出vcf文件,只能读50个,要注册收费,麻烦;电子表格转成vcf文件后,不能正常导入手机(没有ENCODING=QUOTED-PRINTABLE转换,3.0版),不咋地。

3.折腾

问题还没解决啊(同时,还整了另外一款转换的也没弄成),在A款(名字叫VCF通讯录编辑器)手动输入2个姓名电话试试,将那个contacts.vcf文件导入手机,可以。

也就是说,只要把电子表格文件导入就解决问题了,出了意外:

 导入、导出都无法完成,什么鬼气,Excel版本问题?不管了,导出Access文件试试,可以。

Access文件类型mdb,数据库文件,启动Access2007,打开联系人那张表,把电子表格里的姓名、电话号码复制粘贴到对应字段后保存(在Access里面,通过导入xls重新生存一张新表,在VCF通讯录编辑器导入时也会出错,NND没时间研究)。

返回VCF通讯录编辑器,再通过导入Access文件,可以了,保存通讯录。

contacts.vcf文件通过微信传手机,选择联系人打开文件,点击导入VCF文件,成功。

三、思考

VCF格式文件,文本可见,应该是很单纯的,怎么这么难搞。

 这个UID要不要不影响。

 这几项(单位地址、家庭地址、公司等)也不重要。

 这个图片项,太大了,最好是不要。

这里面,除了电话号码外,最重要的一句就是这句了:N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=E9=83=90=AF=E6=38;

quoted-printable编码

可译为“可打印字符引用编码”,在Python里操作认识一下:

>>> import quopri
>>> s='你好'
>>> type(s)
<class 'str'>
>>> b=s.encode()
>>> type(b)
<class 'bytes'>
>>> qe=quopri.encodestring(b)
>>> type(qe)
<class 'bytes'>
>>> qe
b'=E4=BD=A0=E5=A5=BD'   #一个汉字转3字节utf8编码,分别用“=”分开
>>> s='hello'
>>> b=s.encode()
>>> qe=quopri.encodestring(b)
>>> qe
b'hello'               #ASC字符字母无变化
>>> s='	' #Tab键
>>> b=s.encode()
>>> qe=quopri.encodestring(b)
>>> qe
b'=09'                 #Tab键的qp码 
>>> s='='
>>> b=s.encode()
>>> qe=quopri.encodestring(b)
>>> qe
b'=3D'                 #等号的qp码
>>> s=' '#空格
>>> b=s.encode()
>>> qe=quopri.encodestring(b)
>>> qe                 #空格的qp码
b'=20'
>>> s='`~!@#$%^&*()+'#其他字符
>>> b=s.encode()
>>> qe=quopri.encodestring(b)
>>> qe
b'`~!@#$%^&*()+'       #其他字符的qp码无变化
>>> s='你好hello我很好=好=GOOD'
>>> b=s.encode()
>>> qe=quopri.encodestring(b)
>>> qe
b'=E4=BD=A0=E5=A5=BDhello=E6=88=91=E5=BE=88=E5=A5=BD=3D=E5=A5=BD=3DGOOD'
>>>                    #混合字符样式qp码

字符的编码类型除了utf-8,还有(一)GB系列:

>> b=s.encode('gb2312')  >>> b
b'\\xc4\\xe3\\xba\\xc3'
>>> b=s.encode('gbk')  >>> b     #cp936好象跟GBK差不多
b'\\xc4\\xe3\\xba\\xc3'
>>> b=s.encode('gb18030')  >>> b
b'\\xc4\\xe3\\xba\\xc3' 

相关补充(来自网络):

GB2312(1980年)一共收录了7445个字符,汉字区的内码范围高字节从B0-F7,低字节从A1-FE。

1995年的汉字扩展规范GBK1.0收录了21886个符号。

2000年的 GB18030是取代GBK1.0的正式国家标准。该标准收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。现在的PC平 台必须支持GB18030,对嵌入式产品暂不作要求。所以手机、MP3一般只支持GB2312。

从ASCII、 GB2312、GBK到GB18030,这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。在这些编码 中,英文和中文可以统一地处理。区分中文编码的方法是高字节的最高位不为0。按照程序员的称呼,GB2312、GBK到GB18030都属于双字节字符集 (DBCS)。

(二)U系列:

>>> s='你好'
>>> b=s.encode('unicode_escape')
>>> b
b'\\\\u4f60\\\\u597d'

>>>len(b)

12                                 #一个汉字6字节

>>> b[0]
92                                #返回“\\”的ascii值
>>> b[1]
117                              #返回“u”的ascii值,后面类似

>>> bin(b[1])
'0b1110101'                #字符u的ascii
>>> b[1].bit_length()
7                                 #二进制长度7 
>>> type(b[1])
<class 'int'>               #python数据类型:整数型
>>> b[1].to_bytes(1,"big")
b'u'                             #返回ascii代码

相关补充(来自网络):

Unicode 也是一种字符编码方法,不过它是由国际组织设计,可以容纳全世界所有语言文字的编码方案。Unicode的学名是"Universal Multiple-Octet Coded Character Set",简称为UCS。而Unicode只与ASCII兼容,与GB码不兼容。例如“你”字的Unicode编码是4f60,而GB码是c4e3。

UCS有两种格式:UCS-2和UCS-4。顾名思义,UCS-2就是用两个字节编码,UCS-4就是用4个字节(实际上只用了31位,最高位必须为0)编码。UCS-2有2^16=65536个码位,UCS-4有2^31=2147483648个码位。

怎样传输这些编码,是由UTF(UCS Transformation Format)规范规定的,常见的UTF规范包括UTF-8、UTF-7、UTF-16、UTF-32。

>>> b=s.encode('utf8') #默认,可省:b=s.encode()
>>> b
b'\\xe4\\xbd\\xa0\\xe5\\xa5\\xbd'      #utf8编码:一个汉字3字节,每字节长度为8

>>> b[0]
228
>>> b[0].bit_length()
8
>>> bin(b[0])
'0b11100100'
>>> b[0].to_bytes(1,'big')
b'\\xe4'

b=s.encode('utf-16')  >>> b  #utf16编码:一个汉字4字节,两个6,三个8
b'\\xff\\xfe`OY'

>>> b=s.encode('utf-32')  >>> b  #utf32编码:一个汉字8字节,两个12,三个16
b'\\xff\\xfe\\x00\\x00`O\\x00\\x00Y\\x00\\x00'

>>> b=s.encode('utf7')  >>> b
b'+T2BZfQ-'   #utf7编码:一个汉字5字节,两个8,三个10,四个13,,332递增型

(三)其他:

>>> s='你好'
>>> b=s.encode('big5')
>>> len(b)
4
>>> b
b'\\xa7A\\xa6n' 
 #BIG5编码:一个汉字2字节,长:前8后7

>>> b[0].bit_length()
8
>>> b[1].bit_length()
7

相关补充(来自网络):

UTF-8编码字节含义

  • 对于UTF-8编码中的任意字节B,如果B的第一位为0,则B独立的表示一个字符(ASCII码);
  • 如果B的第一位为1,第二位为0,则B为一个多字节字符中的一个字节(非ASCII字符);
  • 如果B的前两位为1,第三位为0,则B为两个字节表示的字符中的第一个字节;
  • 如果B的前三位为1,第四位为0,则B为三个字节表示的字符中的第一个字节;
  • 如果B的前四位为1,第五位为0,则B为四个字节表示的字符中的第一个字节;

utf-8汉字编码3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。

例如“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,将6C49写成二进制是:0110 110001 001001, 用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。三字节编码从“E”开始。

四、代码实现

1.先来个操作界面。就用TKinter。

 部分代码如下:

from tkinter import *
from tkinter import filedialog
import os
import openpyxl


root= Tk()
root.title('电子表格转vcf(qq:35386940)')
root.geometry('640x500') # 这里的乘号不是 * ,而是小写英文字母 x
root.resizable(False,False)#固定窗口大小

def run_xls2vcf():
    pass
    return    

#添加按钮
btn21 = Button(root, text='xlsx → vcf', command=run_xls2vcf)#添加按钮
btn21.place(relx=0.7, rely=0.05, relwidth=0.2, relheight=0.1)#放置位子:百分比
#设置文本框
txt=Text(root)#设置文本框
txt.insert('end','Hello!(Ctrl+C复制)')
txt.pack(padx=3,pady=103)#边缘点距

root.mainloop()

2.读取xlsx文件

(待加)

以上是关于2021-03-17 在linux上将vcf文件转plink的格式bed,bim,fam的主要内容,如果未能解决你的问题,请参考以下文章

通讯录制作(.csv文件转.vcf文件即vcard格式)

三星 通讯录 .spb格式转.vcf

手机联系人批量导入(字符编码xls转vcf)

Linux上将二进制文件转化为c语言数组

GATK4 SelectVariants ——vcf文件提取SNP和indel

导入联系人VCF卡后显示全是乱码怎么解决