За скрипт буду очень благодарен.
По экселю не подскажу, бо для меня сие есть "темный лес".
Старый скрипт-конвертер csv2tnt не нашел. Пришлось набросать новый.
Не судите строго по красоте кода - главное правильно работает)
Что необходимо для использования скрипта?
1)
Python. Для виндовс:
x86 или
64-бит2) Библиотека научных вычислений для питона -
numpy (версия только для вин32)
Как использовать скрипт?
1) скрипт должен лежать в том же каталоге, где находится файл csv, который надо преобразовать для работы с TNT
2) Допустим, наш рабочий каталог, тот в котором находятся скрипт и csv-файл, находится по адресу C:\blablabla
в этом случае, переходим в рабочий каталог с помощью команды:
cd C:\blablabla3) Запускаем сам скрипт:
python csv2tnt.py myfile.csv 67Разберем по порядку:
python - вызов интерпретатора
csv2tnt.py - передача питону названия скрипта для выполнения
myfile.csv - передача скрипту названия csv-файла для обработки
67 - количество маркёров, которые будут обработаны (число не должно превышать реальное число маркеров имеющихся в файле)
В результате работы скрипта, в нашем рабочем каталоге появится новый файл, с расширением tnt. Он
уже готов для загрузки в программу TNT. Но можно в него дописать веса, синонимы маркеров и прочее.
Теперь о формате входного CSV-файла:
* Он не должен содержать никаких заголовков. Только данные, начиная с первой ячейки, первой строки.
* В качестве ограничителей ячеек, должен быть использован знак '
;'
* В первом столбце должен быть номер кит (или другой уникальный идентификатор).
* Второй столбец содержит имена.
* Начиная с третьего столбца, и далее, вводятся маркёры. Количество маркеров, определяет сам пользователь. Следует оговориться, что количество маркеров, для всех гаплотипов, должно по возможности быть одинаковым. Не должно быть микса из 12-ти, 37-ми, 67-ми маркерных гаплотипов. В поля, предназначенные для ввода значений маркеров, следует вводить только числовые значения, при отсутствии оных - поле оставляем пустым!
Как-то так. Будут вопросы - постараюсь ответить.
Собственно скрипт:
__author__ = 'Semargl'
# -*- coding: utf-8 -*-
import csv, sys
from numpy import *
dict_translate = {0:'0',1:'1',2:'2',3:'3',4:'4',5:'5',6:'6',7:'7',8:'8',9:'9',10:'A',11:'B',12:'C',13:'D',14:'E',15:'F',16:'G',17:'H',18:'I',19:'J',20:'K',21:'L',22:'M',23:'N',24:'O',25:'P',26:'Q',27:'R',28:'S',29:'T',30:'U',31:'V',99:'?',98:'?'}
file_name = sys.argv[1]
num_col = int(sys.argv[2])
list_tax = []
list_ht = []
with open(file_name, 'r') as f:
reader = csv.reader(f, delimiter = ';')
for row in reader:
taxon = '%s_%s ' % (row[1], row[0])
taxon = taxon[:20]
list_dys = []
for i in range(2,num_col+2):
if row[i] and row[i] != '0':
list_dys.append(row[i])
else:
list_dys.append('99')
list_tax.append(taxon)
list_ht.append(list_dys)
ar = array(list_ht, dtype=int32)
num_tax = ar.shape[0]
num_column = ar.shape[1]
for i in range(num_column):
column = ar[:,i]
min_in_column = column.min()
cnt = 0
for value in column:
column[cnt] = value - min_in_column
cnt+=1
ar[:,i] = column
out_file_name = '%s.tnt' % (file_name,)
f_out = open(out_file_name, 'w')
head = 'nstate 32\nxread %s %s\n' % (num_column, num_tax)
f_out.write(head)
cnt = 0
for row in ar:
s = list_tax[cnt]
for value in row:
try:
s += '%s' % (dict_translate[value])
except KeyError:
s += '?'
s += '\n'
cnt += 1
f_out.write(s)