저는 Evolution 3.0.2(Fedora 15 설치의 스택)를 실행하고 있습니다. 일부 연락처가 포함된 CSV 파일이 있습니다. 이 파일은 기존 휴대폰을 백업할 때 삼성 소프트웨어에서 생성되었습니다.
File
-> Import...
-> 로 이동하여 Import a single file
내 파일을 선택하면 세 가지 옵션이 제공됩니다 File Type
.
- Evolution CSV 또는 탭(.csv, .tab)
- Mozilla CSV 또는 탭(.csv, .tab)
- Outlook CSV 또는 탭(.csv, .tab)
세 가지 옵션을 모두 사용하여 가져오기를 시도했지만 아무 것도 작동하지 않는 것 같습니다. 대상이 수정되지 않았습니다.
삼성에서 생성한 파일은 매우 장황합니다. 첫 번째 줄은 다음과 같습니다.
"성", "이름", "표시 이름", "닉네임", "읽는 이름(성)", "읽는 이름(이름)", "공식 직함", "회사 이름", "전화번호" 1(유형) ","전화번호 1(번호)","전화번호 1(단축키)","전화번호 2(유형)","전화번호 2(번호)","전화번호 2(단축키) "," 전화번호 3(유형)", "전화번호 3(번호)", "전화번호 3(단축키)", "전화번호 4(유형)", "전화번호 4(번호)", "전화번호 4( 단축키)","전화번호 5(유형)","전화번호 5(번호)","전화번호 5(핫키)","전화번호 6(유형)","전화번호 6(번호)" ,"전화번호 6(단축키)","전화번호 7(유형)","전화번호 7(번호)","전화번호 7(단축키)","전화번호 8(유형)","전화번호 번호 8(번호)", "전화번호 8(단축키)", "전화번호 9(유형)", "전화번호 9(번호)", "전화번호 9(단축키)", "전화번호 10(유형)" ,"전화번호 10(번호)","전화번호 10(핫키)","전화번호 11(유형)","전화번호 11(번호)","전화번호 11(핫키)" ,"전화번호 12 (유형)","전화번호 12(번호)","전화번호 12(단축키)","전화번호 13(유형)","전화번호 13(번호)","전화번호 13(단축키)", "전화번호 14(유형)","전화번호 14(번호)","전화번호 14(핫키)","이메일 1(유형)","이메일 1(주소)","이메일2(유형)", "email2 (주소)", "email3 (유형)", "email3 (주소)", "email4 (유형)", "email 이메일 4 (주소) )", "Email 5 (유형)", "Email 5 ( 주소)", "이메일 6(유형)", "이메일 6(주소)", "이메일 7(유형)", "이메일 7(주소)", "이메일 8(유형)", "이메일 8(주소) ","이메일 9 (유형)","이메일 9 (주소)","이메일 이메일 10 (유형)", "이메일 10 (주소)", "웹 페이지 1 (유형)", "웹 페이지 1 (주소) ) )", "웹페이지 2(유형)", "웹페이지 2(주소)", " 웹페이지 3(유형)", "웹페이지 3(주소)", "웹페이지 4(유형)", " 웹페이지 4(주소)", "웹페이지 5(유형)", "웹페이지 5(주소)", "웹페이지 6(유형)", "웹페이지 6(주소)", "웹페이지 7(유형) )","웹페이지 7(주소)","웹페이지 8(유형)","웹페이지 8(주소)","웹페이지 9(유형) )", "웹페이지 9(주소)", "웹페이지 10(유형)", "웹페이지 10(주소)", "메신저1(유형)", "메신저1(ID)", "메신저2(유형)", "메신저2(ID)", "메신저3(유형)"," 메신저3(ID)","메신저4(유형)","메신저4(ID)","메신저5(유형)","메신저5(ID)","메신저6(유형)","메신저6(ID)","메신저7 (유형)","Messenger7(ID)","Messenger8(유형)","Messenger8(ID)","Messenger9(유형)","Messenger9(ID)", "Messenger10(유형)", "Messenger10( ID)", "주소1(집/사무실)", "주소1(국내/외국)", "주소1(사서함)", "주소1(상세정보)", "주소1(번지)", "주소1(시/시/ 타운)","주소1(군/지역)","주소1(국가)","주소1(우편번호) ","주소2(자택/사무실)","주소2(국내/해외)","주소2(PO) Box)","주소2(상세정보)","주소2(번지)" ,"주소2(시/읍)","주소2(군/지역)","주소2(국가)","주소2(우편번호) " ,"주소3(집/사무실)","주소3(국내/해외)","주소3(사서함)","주소3(상세정보)","주소3(번지)","주소3(시/읍) " ,"주소3(군/지역)"," 주소 3(국가)", "주소 3(우편번호)","주소 4(집/사무실)", "주소 4(국내/해외)", "주소 4(사서함)", "주소 4(상세정보)", "주소 4(번지)", "주소 4( 시/군)", "주소 4(군/지역)", "주소 4(국가)", "주소 4(우편번호)", "주소 5(집/사무실)", "주소 5(국내/해외) )","주소 5(사서함)","주소 5(세부정보)","주소 5(번지)","주소 5(시/군)","주소 5(군/지역)" , " 주소 5(국가)", "주소 5(우편번호)", "주소 6(집/사무실)", "주소 6(국내/해외)", "주소 6(사서함)", "주소 6(상세정보) ) )","주소 6(번지)","주소 6(시/군)","주소 6(군/지역)","주소 6(국가)","주소 6(우편번호)", "주소7(집/사무실)","주소7(국내/해외)","주소7(사서함)","주소7(상세정보)","주소7(번지)","주소7(시/읍)", "주소7(국가/지역)","주소7(국가/지역)","주소7(우편번호)","주소8(집/사무실)","주소8(국내/해외)"," 주소8(사서함) ", "주소8(세부정보)", "주소8(번지)", "주소8(시/읍)", "주소8(군/지역)", "주소8(국가) ","주소8(우편번호)" ,"주소 9(자택/사무실)","주소 9(국내/해외)","주소 9(사서함)","주소 9(상세정보)"," 주소 9(번지)", "주소 9 (시/도)", "주소 9(군/지역)", "주소 9(국가)", "주소 9(우편번호)", "주소 10(집/회사)", "주소 10(국내/해외) )","주소10(사서함)","주소10(세부정보)","주소10(번지)","주소10(시/군)","주소10(군/지역)","주소 10(국가) ","주소 10(우편번호)","생일(날짜)","생일(양력/음력)","기념일 1(날짜)","기념일 1(양력/음력)", " Anniversary 2(날짜)", "Anniversary 2(양력/음력)", "Anniversary 3(날짜)", "Anniversary 3(양력/음력)", ""혈액형", "취미", " 벨소리 유형" ","벨소리", "메시지 벨소리 유형", "메시지 벨소리", "사진 파일", "메모", "음성 인식", "이중 기계 모드", "제목", "중간 이름", "접미사","부서","비서 이름","비서 전화번호","관리자","정부 ID","계좌","고객 ID","사무실 위치","배우자","자녀", "카테고리", "추가 정보""주소10(집/사무실)","주소10(국내/해외)","주소10(사서함)","주소10(상세정보)","주소10(번지)","주소10(시/읍)" , "주소 10(군/지역)", "주소 10(국가)", "주소 10(우편번호)", "생일(날짜)", "생일(양력/음력)", "기념일 1(날짜 ) ", "Anniversary 1(양력/음력)", "Anniversary 2(날짜)", "Anniversary 2(양력/음력)", "Anniversary 3(날짜)", "Anniversary 3(양력/음력)" 음력)", "혈액형", "취미", "벨소리 유형" ", "벨소리", "메시지 벨소리 유형", "메시지 벨소리", "사진 파일", "메모", "말하기" 인식", "이중 기계 패턴", "제목", "중간 이름", "접미사", "부서", "보조 이름", "보조 전화 번호", "관리자", "정부 ID", "계정", "고객 ID","사무실 위치","배우자","자녀","범주", "추가 정보""주소10(집/사무실)","주소10(국내/해외)","주소10(사서함)","주소10(상세정보)","주소10(번지)","주소10(시/읍)" , "주소 10(군/지역)", "주소 10(국가)", "주소 10(우편번호)", "생일(날짜)", "생일(양력/음력)", "기념일 1(날짜 ) ", "Anniversary 1(양력/음력)", "Anniversary 2(날짜)", "Anniversary 2(양력/음력)", "Anniversary 3(날짜)", "Anniversary 3(양력/음력)" 음력)", "혈액형", "취미", "벨소리 유형" ", "벨소리", "메시지 벨소리 유형", "메시지 벨소리", "사진 파일", "메모", "말하기" 인식", "이중 기계 패턴", "제목", "중간 이름", "접미사", "부서", "보조 이름", "보조 전화 번호", "관리자", "정부 ID", "계정", "고객 ID","사무실 위치","배우자","자녀","범주", "추가 정보"
나는 진화가 그것이 다른 형태로 나타날 것으로 기대한다고 생각합니다. Evolution에서 이 파일이 어떤 모습일 것으로 예상하는지 지적할 수 있는 사람이 있습니까? 그런 다음 그에 따라 열을 조정할 수 있습니다. 또는 가능하다면 좀 더 직접적인 방법으로 가져오세요.
답변1
이 문제에 대한 나의 해결책은 Python csv 모듈을 사용하여 csv를 읽은 다음 데이터를 vcard에 덤프하는 것이었습니다. vCard에는 여러 개의 연락처가 포함될 수 있으므로 첨부하기만 하면 됩니다.
스크립트:
#!/usr/bin/python
# Read a Samsung backup csv and outputs a vcf file
import csv
import sys
def convert(filename):
reader = csv.reader(open(filename, 'rb'))
for row in reader:
firstname = row[1]
lastname = row[0]
telephone = row[9]
print 'BEGIN:VCARD'
print 'VERSION:2.1'
print 'N:' + lastname + ';' + firstname
print 'FN:' + firstname + ' ' + lastname
print 'TEL;HOME;VOICE:' + telephone
print 'END:VCARD'
def main(args=sys.argv):
if len(args) != 2:
print "Usage:"
print args[0] + " filename"
return 1
convert(args[1])
return 0
if __name__ == '__main__':
sys.exit(main())
사용법은 다음과 같습니다:
./script.py myfile.csv > mycontacts.vcf
그런 다음 생성된 vcf 파일을 Evolution으로 가져옵니다. 추악하지만 효과적입니다.
답변2
검색하는 동안 이 질문을 여러 번 우연히 발견했기 때문에 여기에 업데이트되고 약간 수정된 버전이 있습니다.비토 피세의 답변Python 3에서 사용 가능합니다. 버전 3.10에서 테스트됨
#!/usr/bin/python
import csv
import sys
def convert(filename):
f_csv = csv.reader(open(filename, 'r'), delimiter=",")
f_vcard = open(f'vcard_{filename.split(".")[0]}.vcard', 'w+')
for row in f_csv:
firstname = row[1]
lastname = row[2]
birthday = row[3]
mail = row[4]
telephone = row[5]
f_vcard.write('BEGIN:VCARD\n')
f_vcard.write('VERSION:3.0\n')
f_vcard.write(f'N:{lastname};{firstname}\n')
f_vcard.write(f'FN:{firstname} {lastname}\n')
f_vcard.write(f'TEL;TYPE=CELL;VOICE:{telephone}\n')
f_vcard.write(f'EMAIL;TYPE=OTHER:{mail}\n')
f_vcard.write(f'END:VCARD\n')
f_vcard.close()
def main(args=sys.argv):
if len(args) != 2:
print("Usage:")
print(f"{args[0]} filename")
return 1
convert(args[1])
return 0
if __name__ == '__main__':
sys.exit(main())