Nano Hash - криптовалюты, майнинг, программирование

Разбор текстового файла в базу данных sql с использованием python

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

Как видно из названия, у меня есть очень большой текстовый файл, который я хочу преобразовать в базу данных sql, предпочтительно используя python. Текстовый файл настроен так:

#Parent field 1.1
child 1.1
child 1.1 continued

# Parent field 1.2
child 1.2

# Parent field 1.3
child 1.3 text
child 1.3 text
more child 1.3 text

...

# Parent field 1.88
child 1.88

#Parent field 2.1
child 2.1

etc...

Некоторые ключевые моменты о списке:

  • первое поле (т.е. 1.1, 2.1) не имеет пробела после #
  • длина каждой дочерней строки имеет переменную длину символов и разрывы строк, но перед следующей родительской строкой всегда есть пустая строка
  • есть 88 полей для каждого родителя
  • есть сотни родительских полей

Теперь я хотел бы, чтобы каждое родительское поле (1.1, 1.2, 1.3 --> .88) было столбцом, а строки заполнялись последующими числами (2.1, 3.1 --> 100s)

Может ли кто-нибудь помочь мне настроить скрипт Python и дать мне какое-то направление, как начать синтаксический анализ? Дайте мне знать, если я не объяснил задачу должным образом, и я быстро предоставлю более подробную информацию.

Спасибо большое!

Бен

РЕДАКТИРОВАТЬ: я только что понял, что количество столбцов НЕ является константой 88, это переменная


  • Вы динамически создаете таблицы базы данных в зависимости от содержимого текстового файла? Т.е. будет ли меняться количество столбцов или тип/размер столбца? Какую СУБД вы используете? 18.01.2013
  • Кроме того, можете ли вы уточнить, что вы имеете в виду, когда говорите, что для каждого родителя есть 88 полей, но сотни родительских полей? Звучит так, будто каждые 88 родителей = 88 столбцов, но сюда вставляется несколько таблиц? 18.01.2013
  • Привет willOEM, спасибо за ваш ответ. Да, 88 представляет собой количество столбцов, но я только что понял, что 88 НЕ является постоянным для каждого родителя, это переменная величина. Насколько это создаст проблему? 18.01.2013
  • Если вы анализируете эти данные в одной таблице с заданным максимальным количеством столбцов с заданной шириной, то не будет проблемой, если данные для каждого столбца не будут присутствовать в каждой строке. Если мы говорим о флуктуирующих определениях таблицы, то это более сложная проблема. Насколько проблема будет зависеть от используемой вами СУБД и модуля Python. 19.01.2013

Ответы:


1

Несколько моментов:

  1. Из описания кажется, что вы стремитесь к тому, чтобы ваши данные были денормализованы в одной таблице. Как правило, это не очень хорошая идея. Разделите данные на две таблицы: PARENT и CHILDREN. PARENT должен содержать идентификатор, а CHILDREN должен иметь как минимум два столбца: PARENT_ID и CHILD_VALUE (или что-то подобное), где PARENT_ID является идентификатором родителя, независимо от того, связан ли он явно как конструкция БД внешнего ключа или нет (в зависимости от базы данных). Затем, во время синтаксического анализа, ВСТАВЬТЕ в таблицу CHILDREN соответствующую запись со значениями ("1.1", "1.1childA"), VALUES ("1.1", "1.1childB") и так далее.

  2. синтаксический анализ должен быть тривиальным: повторять строку за строкой, а в «родительской» строке изменить parent_id и INSERT на PARENT и читать дочерние строки по ходу дела и INSERT их в таблицу CHILDREN. Вы также можете сделать это в два прохода.

Что-то вроде этого:

#!/usr/bin/python

parent=''
child=''

for line in open('input.txt'):
        if line.find('#Parent') > -1 or line.find('# Parent') > -1:
                parent = field_extract(line) # fun where you extract parent value
                parent_id = ... # write it down or generate
                # INSERT into PARENT
        elif line:
                child = field_extract(line)
                # INSERT into CHILDREN with parent_id and child values

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

18.01.2013
  • Большое спасибо, я обязательно попробую этот двухэтапный процесс. 18.01.2013
  • @бен: P.S. Я не уверен, насколько вы знакомы с SQL, но две таблицы здесь дают вам некоторую гибкость: если у вас есть таблица PARENT с 88 столбцами и таблица CHILDREN со значениями, вы можете выполнять умные запросы SELECT с JOIN для таблиц PARENT и CHILDREN. , это именно то, для чего базы данных SQL предназначены для обеспечения высокой производительности. Недостатком является то, что вам нужно научиться использовать JOIN. :-) 18.01.2013
  • еще раз спасибо. я только что понял, что столбец 88 # не является абсолютным и изменяется в зависимости от каждого родителя. это создаст проблему? также я должен упомянуть, что не все поля названы #parent, но разные для каждого, есть ли способ сказать line.find # + +text vs # + text? 18.01.2013
  • 1. Проблема с 88 столбцами: это не должно быть проблемой, если все, что у вас есть, это незаполненные поля: просто вставьте туда NULL. Однако, если изменяется type, это становится большей проблемой, поскольку столбец может иметь только один тип. Google BigTable не имеет такого рода ограничений, но я предполагаю, что у вас нет GAE на полке. :-) 2. чем именно отличаются поля? если это просто пробел, но значения могут быть найдены, вы можете сначала сделать parvals = line.split(' '), а затем ''.join(parvals) и получить унифицированный родительский идентификатор. 18.01.2013
  • Однако, если родительские идентификаторы изменяются в структуре от родительской строки к родительской строке, это может быть время регулярного выражения. (и, как говорит JWZ, у вас две проблемы :-) 18.01.2013

  • 2

    вам следует изучить обработку файлов в python.

    open() , .readlines() методы и списки помогут вам много.

    Например:

    f = open("NAMEOFTXTFILE.TXT","r") #r for read, w for write, a for append.
    cell = f.readlines() # Displays the content in a list
    f.seek(0) # Just takes the cursor to the first cell (start of document)
    print cell[2] # Prints the word or letter in the second cell.
    

    затем оттуда вы можете отправить cell[2] с операторами sql.

    18.01.2013
  • ОП написал что-то о том, что файл большой. Если он действительно большой, .readlines не очень хорошая идея, так как он попытается прочитать весь файл в память. Лучше идите построчно, если можете, и здесь, похоже, вы можете. 18.01.2013
  • привет mrkafk, большое спасибо :-) Он очень большой, поэтому я постараюсь сделать это построчно 18.01.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..