Как извлечь данные из файла данных asn1 и загрузить их в фрейм данных?

Моя конечная цель — загрузить метаданные, полученные от PubMed, в кадр данных pyspark. До сих пор мне удавалось загружать нужные мне данные из базы данных PubMed с помощью сценария оболочки. Загруженные данные имеют формат asn1. Вот пример ввода данных:

Pubmed-entry ::= {
  pmid 31782536,
  medent {
    em std {
      year 2019,
      month 11,
      day 30,
      hour 6,
      minute 0
    },
    cit {
      title {
        name "Impact of CYP2C19 genotype and drug interactions on voriconazole
 plasma concentrations: a spain pharmacogenetic-pharmacokinetic prospective
 multicenter study."
      },
      authors {
        names std {
          {
            name ml "Blanco Dorado S",
            affil str "Pharmacy Department, University Clinical Hospital
 Santiago de Compostela (CHUS). Santiago de Compostela, Spain.; Clinical
 Pharmacology Group, University Clinical Hospital, Health Research Institute
 of Santiago de Compostela (IDIS). Santiago de Compostela, Spain.; Department
 of Pharmacology, Pharmacy and Pharmaceutical Technology, Faculty of Pharmacy,
 University of Santiago de Compostela (USC). Santiago de Compostela, Spain."
          },
          {
            name ml "Maronas O",
            affil str "Genomic Medicine Group, Centro Nacional de Genotipado
 (CEGEN-PRB3), CIBERER, CIMUS, University of Santiago de Compostela (USC),
 Santiago de Compostela, Spain."
          },
          {
            name ml "Latorre-Pellicer A",
            affil str "Genomic Medicine Group, Centro Nacional de Genotipado
 (CEGEN-PRB3), CIBERER, CIMUS, University of Santiago de Compostela (USC),
 Santiago de Compostela, Spain."
          },
          {
            name ml "Rodriguez Jato T",
            affil str "Pharmacy Department, University Clinical Hospital
 Santiago de Compostela (CHUS). Santiago de Compostela, Spain."
          },
          {
            name ml "Lopez-Vizcaino A",
            affil str "Pharmacy Department, University Hospital Lucus Augusti
 (HULA). Lugo, Spain."
          },
          {
            name ml "Gomez Marquez A",
            affil str "Pharmacy Department, University Hospital Ourense
 (CHUO). Ourense, Spain."
          },
          {
            name ml "Bardan Garcia B",
            affil str "Pharmacy Department, University Hospital Ferrol (CHUF).
 A Coruna, Spain."
          },
          {
            name ml "Belles Medall D",
            affil str "Pharmacy Department, General University Hospital
 Castellon (GVA). Castellon, Spain."
          },
          {
            name ml "Barbeito Castineiras G",
            affil str "Microbiology Department, University Clinical Hospital
 Santiago de Compostela (CHUS). Santiago de Compostela, Spain."
          },
          {
            name ml "Perez Del Molino Bernal ML",
            affil str "Microbiology Department, University Clinical Hospital
 Santiago de Compostela (CHUS). Santiago de Compostela, Spain."
          },
          {
            name ml "Campos-Toimil M",
            affil str "Department of Pharmacology, Pharmacy and Pharmaceutical
 Technology, Faculty of Pharmacy, University of Santiago de Compostela (USC).
 Santiago de Compostela, Spain."
          },
          {
            name ml "Otero Espinar F",
            affil str "Department of Pharmacology, Pharmacy and Pharmaceutical
 Technology, Faculty of Pharmacy, University of Santiago de Compostela (USC).
 Santiago de Compostela, Spain."
          },
          {
            name ml "Blanco Hortas A",
            affil str "Epidemiology Unit. Fundacion Instituto de Investigacion
 Sanitaria de Santiago de Compostela (FIDIS), University Hospital Lucus
 Augusti (HULA), Spain."
          },
          {
            name ml "Duran Pineiro G",
            affil str "Clinical Pharmacology Group, University Clinical
 Hospital, Health Research Institute of Santiago de Compostela (IDIS).
 Santiago de Compostela, Spain."
          },
          {
            name ml "Zarra Ferro I",
            affil str "Pharmacy Department, University Clinical Hospital
 Santiago de Compostela (CHUS). Santiago de Compostela, Spain.; Clinical
 Pharmacology Group, University Clinical Hospital, Health Research Institute
 of Santiago de Compostela (IDIS). Santiago de Compostela, Spain."
          },
          {
            name ml "Carracedo A",
            affil str "Genomic Medicine Group, Centro Nacional de Genotipado
 (CEGEN-PRB3), CIBERER, CIMUS, University of Santiago de Compostela (USC),
 Santiago de Compostela, Spain.; Galician Foundation of Genomic Medicine,
 Health Research Institute of Santiago de Compostela (IDIS), SERGAS, Santiago
 de Compostela, Spain."
          },
          {
            name ml "Lamas MJ",
            affil str "Clinical Pharmacology Group, University Clinical
 Hospital, Health Research Institute of Santiago de Compostela (IDIS).
 Santiago de Compostela, Spain."
          },
          {
            name ml "Fernandez-Ferreiro A",
            affil str "Pharmacy Department, University Clinical Hospital
 Santiago de Compostela (CHUS). Santiago de Compostela, Spain.; Clinical
 Pharmacology Group, University Clinical Hospital, Health Research Institute
 of Santiago de Compostela (IDIS). Santiago de Compostela, Spain.; Department
 of Pharmacology, Pharmacy and Pharmaceutical Technology, Faculty of Pharmacy,
 University of Santiago de Compostela (USC). Santiago de Compostela, Spain."
          }
        }
      },
      from journal {
        title {
          iso-jta "Pharmacotherapy",
          ml-jta "Pharmacotherapy",
          issn "1875-9114",
          name "Pharmacotherapy"
        },
        imp {
          date std {
            year 2019,
            month 11,
            day 29
          },
          language "eng",
          pubstatus aheadofprint,
          history {
            {
              pubstatus other,
              date std {
                year 2019,
                month 11,
                day 30,
                hour 6,
                minute 0
              }
            },
            {
              pubstatus pubmed,
              date std {
                year 2019,
                month 11,
                day 30,
                hour 6,
                minute 0
              }
            },
            {
              pubstatus medline,
              date std {
                year 2019,
                month 11,
                day 30,
                hour 6,
                minute 0
              }
            }
          }
        }
      },
      ids {
        pubmed 31782536,
        doi "10.1002/phar.2351",
        other {
          db "ELocationID doi",
          tag str "10.1002/phar.2351"
        }
      }
    },
    abstract "BACKGROUND: Voriconazole, a first-line agent for the treatment
 of invasive fungal infections, is mainly metabolized by cytochrome P450 (CYP)
 2C19. A significant portion of patients fail to achieve therapeutic
 voriconazole trough concentrations, with a consequently increased risk of
 therapeutic failure. OBJECTIVE: To show the association between
 subtherapeutic voriconazole concentrations and factors affecting voriconazole
 pharmacokinetics: CYP2C19 genotype and drug-drug interactions. METHODS:
 Adults receiving voriconazole for antifungal treatment or prophylaxis were
 included in a multicenter prospective study conducted in Spain. The
 prevalence of subtherapeutic voriconazole troughs were analyzed in the rapid
 metabolizer and ultra-rapid metabolizer patients (RMs and UMs, respectively),
 and compared with the rest of the patients. The relationship between
 voriconazole concentration, CYP2C19 phenotype, adverse events (AEs), and
 drug-drug interactions was also assessed. RESULTS: In this study 78 patients
 were included with a wide variability in voriconazole plasma levels with only
 44.8% of patients attaining trough concentrations within the therapeutic
 range of 1 and 5.5 microg/ml. The allele frequency of *17 variant was found
 to be 29.5%. Compared with patients with other phenotypes, RMs and UMs had a
 lower voriconazole plasma concentration (RM/UM: 1.85+/-0.24 microg/ml versus
 other phenotypes: 2.36+/-0.26 microg/ml, ). Adverse events were more common
 in patients with higher voriconazole concentrations (p<0.05). No association
 between voriconazole trough concentration and other factors (age, weight,
 route of administration, and concomitant administration of enzyme inducer,
 enzyme inhibitor, glucocorticoids, or proton pump inhibitors) was found.
 CONCLUSION: These results suggest the potential clinical utility of using
 CYP2C19 genotype-guided voriconazole dosing to achieve concentrations in the
 therapeutic range in the early course of therapy. Larger studies are needed
 to confirm the impact of pharmacogenetics on voriconazole pharmacokinetics.",
    pmid 31782536,
    pub-type {
      "Journal Article"
    },
    status publisher
  }
}

Вот где я застрял. Я не знаю, как извлечь информацию из asn1 и передать ее в кадр данных pyspark. Может ли кто-нибудь предложить способ сделать это?


person Ferran Dean    schedule 06.12.2019    source источник
comment
Вероятно, вам следует начать с библиотеки декодера asn1 (pypi.org/project/asn1)   -  person mermaldad    schedule 06.12.2019
comment
Насколько я понимаю, библиотеки декодера asn1 декодируют только байты asn1. Итак, как я могу расшифровать приведенные выше данные?   -  person Ferran Dean    schedule 06.12.2019
comment
что заставляет вас говорить, что это значение asn1? у вас есть спецификация?   -  person YaFred    schedule 06.12.2019
comment
Также есть ncbi.nlm.nih.gov/IEB/ToolBox/ SDKDOCS/ASNLIB.HTML, который выглядит как более полный синтаксический анализатор. Хотя выглядит довольно вовлеченным.   -  person mermaldad    schedule 07.12.2019
comment
@YaFred это спецификация asn1 ncbi.nlm .nih.gov/IEB/ToolBox/CPP_DOC/asn_spec/pubmed.asn.html   -  person Ferran Dean    schedule 07.12.2019
comment
@Ферран Дин. Есть ли у вас доступ к закодированным данным BER?   -  person YaFred    schedule 07.12.2019


Ответы (2)


Приведенные выше данные определенно представлены в «формате ASN.1». Этот формат называется нотация значений ASN.1 и используется для текстового представления значений ASN.1. (Этот формат предшествует стандартизации правил кодирования JSON. Сегодня можно использовать JSON для той же цели, с некоторыми отличиями в способе обработки JSON по сравнению с нотацией значений ASN.1).

Схема ASN.1, которую YaFred разместил выше, содержит несколько ошибок, как отметил сам YaFred. Обозначение, которое вы разместили сами, также, похоже, содержит несколько ошибок. Я просмотрел весь набор файлов ASN.1 NCBI и заметил, что они содержат несколько ошибок. Из-за этого они не могут быть обработаны соответствующим стандарту ASN.1 инструментом (таким как игровая площадка ASN.1), если они не исправлены. Некоторые из этих ошибок легко исправить, но исправление других ошибок требует знания намерений автора этих файлов. Такое положение вещей, вероятно, связано с тем, что проект NCBI использует собственный инструментарий ASN.1, который, возможно, использует ASN.1 каким-то нестандартным образом.

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

person Alessandro    schedule 07.12.2019

Ваша проблема может быть не простой, но стоит поэкспериментировать.

Способ 1:

Поскольку у вас есть спецификация, вы можете попробовать найти инструмент ASN.1 (он же компилятор ASN.1), который создаст модель данных. В вашем случае, поскольку вы загрузили текстовое значение ASN.1, вам нужен этот инструмент для предоставления декодеров значений ASN.1.

Если бы инструмент генерировал код Java, он выглядел бы так:

// decode a Pubmed-entry
// input is your data
Asn1ValueReader reader = new Asn1ValueReader(input);
PubmedEntry obj = PubmedEntry.readPdu(reader);
// access the data
obj.getPmid();
obj.getMedent();

Несколько предостережений:

  • Инструменты, которые могут делать все это, не будут бесплатными (если вы их вообще найдете). Проблема здесь в том, что у вас есть текстовое значение ASN1, в то время как инструменты обычно предоставляют двоичные декодеры (BER, DER и т. д.)
  • У вас есть много связующего кода, который нужно написать, чтобы создать запись, которая входит в ваш фрейм данных pyspark.

Я написал это некоторое время назад, но у него нет текстовых декодеров значений ASN1.

Способ 2:

Если ваши данные достаточно просты и являются текстовыми данными, вы можете попробовать написать свой собственный парсер (используя такой инструмент, как ANTLR)... Нелегко оценить этот метод, если вы не знакомы с парсерами.

РЕДАКТИРОВАТЬ: К сожалению, спецификация недействительна.

person YaFred    schedule 07.12.2019