2013-07-23 3 views
1

Мне дан следующий CSV-файл, который я извлек из таблицы Excel. Чтобы дать некоторую справочную информацию, которая могла бы помочь, в ней обсуждаются номера AGI (считайте их идентификаторами белка), немодифицированные последовательности пептидов для этих идентификаторов белка, а затем модифицированные последовательности пептидов с модификациями, сделанными на неизмененных последовательностях, индекс/индексы этих модификаций, а затем комбинированный спектральный счет для повторных пептидов. Текстовый файл называется MASP.GlycoModReader.txt и информация в следующем формате ниже:Разбор по CSV-файлу для преобразования в файл формата JSON

AGI,UnMd Peptide (M) = x,Mod Peptide (oM) = Ox,Index/Indeces of Modification,counts,Combined 
Spectral count for repeated Peptides 

AT1G56070.1,NMSVIAHVDHGKSTLTDSLVAAAGIIAQEVAGDVR,NoMSVIAHVDHGKSTLTDSLVAAAGIIAQEVAGDVR,2,17 
AT1G56070.1,LYMEARPMEEGLAEAIDDGR,LYoMEARPoMEEGLAEAIDDGR,"3, 9",1 
AT1G56070.1,EAMTPLSEFEDKL,EAoMTPLSEFEDKL,3,7 
AT1G56070.1,LYMEARPMEEGLAEAIDDGR,LYoMEARPoMEEGLAEAIDDGR,"3, 9",2 
AT1G56070.1,EGPLAEENMR,EGPLAEENoMR,9,2 
AT1G56070.1,DLQDDFMGGAEIIK,DLQDDFoMGGAEIIK,7,1 

выходной файл, который должен привести после извлечения выше в следующем формате ниже:

AT1G56070.1,{"peptides": [{"sequence": "NMSVIAHVDHGKSTLTDSLVAAAGIIAQEVAGDVR", "mod_sequence":  
"NoMSVIAHVDHGKSTLTDSLVAAAGIIAQEVAGDVR" , "mod_indeces": 2, "spectral_count": 17}, {"sequence": 
"LYMEARPMEEGLAEAIDDGR" , "mod_sequence": "LYoMEARPoMEEGLAEAIDDGR", "mod_indeces": [3, 9], 
"spectral_count": 3}, {"sequence": "EAMTPLSEFEDKL" , "mod_sequence": "EAoMTPLSEFEDKL", 
"mod_indeces": [3,9], "spectral_count": 7}, {"sequence": "EGPLAEENMR", "mod_sequence": 
"EGPLAEENoMR", "mod_indeces": 9, "spectral_count": 2}, {"sequence": "DLQDDFMGGAEIIK", 
"mod_sequence": "DLQDDFoMGGAEIIK", "mod_indeces": [7], "spectral_count": 1}]} 

Я представил свое решение ниже: Если у кого-то есть лучшее решение на другом языке или, возможно, проанализируйте мою и сообщите мне, есть ли более эффективные методы для этого, пожалуйста, прокомментируйте ниже. Спасибо.

#!/usr/bin/env node 

    var fs = require('fs'); 
    var csv = require('csv'); 
    var data ="proteins.csv"; 

    /* Uses csv nodejs module to parse the proteins.csv file. 
    * Parses the csv file row by row and updates the peptide_arr. 
    * For new entries creates a peptide object, for similar entries it updates the 
    * counts in the peptide object with the same AGI#. 
    * Uses a peptide object to store protein ID AGI#, and the associated data. 
    * Writes all formatted peptide objects to a txt file - output.txt. 
    */ 

    // Tracks current row 
    var x = 0; 
    // An array of peptide objects stores the information from the csv file 
    var peptide_arr = []; 

    // csv module reads row by row from data 
    csv() 
    .from(data) 
    .to('debug.csv') 
    .transform(function(row, index) { 
     // For the first entry push a new peptide object with the AGI# (row[0]) 
     if(x == 0) { 
     // cur is the current peptide read into row by csv module 
     Peptide cur = new Peptide(row[0]); 

     // Add the assoicated data from row (1-5) to cur 
     cur.data.peptides.push({ 
      "sequence" : row[1]; 
      "mod_sequence" : row[2]; 
      if(row[5]){ 
      "mod_indeces" : "[" + row[3] + ", " + row[4] + "]"; 
      "spectral_count" : row[5]; 
      } else { 
      "mod_indeces" : row[3]; 
      "spectral_count" : row[4]; 
      } 
     }); 

     // Add the current peptide to the array 
     peptide_arr.push(cur); 
     } 

     // Move to the next row 
     x++; 
    }); 

    // Loop through peptide_arr and append output with each peptide's AGI# and its data 
    String output = ""; 
    for(var peptide in peptide_arr) 
    { 
     output = output + peptide.toString() 
    } 
    // Write the output to output.txt 
    fs.writeFile("output.txt", output); 

    /* Peptide Object : 
    * - id:AGI# 
    * - data: JSON Array associated 
    */ 
    function Peptide(id) // this is the actual function that does the ID retrieving and data 
         // storage 
{ 
    this.id = id; 
    this.data = { 
     peptides: [] 
    }; 
} 

/* Peptide methods : 
* - toJson : Returns the properly formatted string 
*/ 
Peptide.prototype = { 
    toString: function(){ 
     return this.id + "," + JSON.stringify(this.data, null, " ") + "/n" 
    } 
}; 

Отредактированное примечание: Кажется, когда я запускаю это решение, которое я разместил, я получаю ошибку утечки памяти; он бесконечно работает, не производя никакого существенного, читаемого выхода. Если кто-то захочет помочь в оценке того, почему это происходит, это было бы здорово.

+0

Это, вероятно, должно быть в обзоре кода вместо SO. –

ответ

0

Работает ли ваша версия? Похоже, вы только создали один объект пептида. Также, что делает оператор if (row [5])? В вашем примере данных всегда есть 5 элементов. Кроме того, mod_indeces всегда должен быть списком, правильно? Потому что в вашем примере выходной файл mod_indeces не является списком в первом пептиде. Во всяком случае, вот что я придумал в Python:

import csv 
import json 
data = {} 
with open('proteins.csv','rb') as f: 
    reader = csv.reader(f) 
    for row in reader: 
     name = row[0] 
     sequence = row[1] 
     mod_sequence = row[2] 
     mod_indeces = map(int,row[3].split(', ')) 
     spectral_count = int(row[4]) 
     peptide = {'sequence':sequence,'mod_sequence':mod_sequence, 
        'mod_indeces':mod_indeces,'spectral_count':spectral_count} 
     if name in data: 
      data[name]['peptides'].append(peptide) 
     else: 
      data[name] = {'peptides':[peptide]} 
    f.close() 

f = open('output.txt','wb') 
for protein in data: 
    f.write(protein) 
    f.write(',') 
    f.write(json.dumps(data[protein])) 
    f.write('\n') 
f.close() 

Если вы на окнах и хотите, чтобы просмотреть файл как обычный текст, вы можете заменить «\ п» с «\ г \ п» или os.linesep.

Если вы хотите, чтобы пропустить некоторые строки (если есть заголовок или что-то), вы можете сделать что-то вроде этого:

import csv 
import json 
data = {} 
rows_to_skip = 1 
rows_read = 0 
with open('proteins.csv','rb') as f: 
    reader = csv.reader(f) 
    for row in reader: 
     if rows_read >= rows_to_skip: 
      name = row[0] 
      sequence = row[1] 
      mod_sequence = row[2] 
      mod_indeces = map(int,row[3].split(', ')) 
      spectral_count = int(row[4]) 
      peptide = {'sequence':sequence,'mod_sequence':mod_sequence, 
         'mod_indeces':mod_indeces,'spectral_count':spectral_count} 
      if name in data: 
       data[name]['peptides'].append(peptide) 
      else: 
       data[name] = {'peptides':[peptide]} 
     rows_read += 1 
    f.close() 

f = open('output.txt','wb') 
for protein in data: 
    f.write(protein) 
    f.write(',') 
    f.write(json.dumps(data[protein])) 
    f.write('\n') 
f.close() 

Если вы хотите, ключи словаря, чтобы быть в определенном порядке, вы можете использовать orderDict вместо стандартного dict. Просто замените пептидную линию следующим образом:

peptide = OrderedDict([('sequence',sequence), 
         ('mod_sequence',mod_sequence), 
         ('mod_indeces',mod_indeces), 
         ('spectral_count',spectral_count)]) 

Теперь заказ сохраняется. То есть sequence следует за mod_sequence, за которым следует mod_indeces, а затем spectral_count. Чтобы изменить порядок, просто измените порядок элементов в OrderedDict.

Обратите внимание, что вам также необходимо добавить from collections import OrderedDict, чтобы иметь возможность использовать OrderedDict.

+0

Спасибо, Мэтью! Я сохранил ваш скрипт в формате Python и запустил его с терминала в Mac OS X. Я получил следующую ошибку, которая может быть с моей стороны, запустив ее, но я буду публиковать ее в любом случае: – zsyed92

+0

Traceback (последний последний звонок) : Файл «/Users/zsyed/PythonPeptideJSON.py», строка 8, в для строки в считывателе: _csv.Error: символ новой строки, видимый в некотируемом поле - вам нужно открыть файл в универсальной-новой строке Режим? – zsyed92

+0

И спасибо за отзыв о моей программе.Я буду принимать во внимание то, что вы сказали, и попытаться пройти через него снова – zsyed92

Смежные вопросы