Запрос CSV-файлов, таких как sql

Насколько я понимаю, этот сценарий является частью коммерческого программного обеспечения InstallAnywhere, у которого есть форум здесь . Я нашел похожий скрипт здесь . Я предполагаю, что произошло, когда вы щелкнули по этому файлу, так это то, что вы его открыли, и то, что вы разместили в своем вопросе, — это не все, что там было, так как в этом сценарии было гораздо больше, и даже то, что вы разместили, выглядело по-другому.. (Я прав?)

Другой найденный мной скрипт, более ранней версии, довольно длинный и сложный, поэтому без особого анализа могу дать вам следующий совет.

  1. Поскольку существует специальный форум, вам следует проводить исследования там, и они должны быть более осведомлены, чтобы дать вам какой-либо совет.

Но я добавлю еще несколько пунктов, поскольку я углубился в эту тему.

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

  2. Рассматриваемый файл свойств из того, что я вижу здесь , требует формы:

    property=value
    

    Итак, вам нужно определить хотя бы эти два:

    lax.class.path=
    lax.nl.java.launcher.main.class=

    Как вы его создаете? В Linux есть много способов. Вы можете попробоватьvi(сложный ),vim(менее сложный ),nano(довольно простой ), или вы можете использовать графический интерфейс, например gedit.

  3. Что касается файла .jar, это архивный файл Java.

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

-1
24.06.2020, 13:04
6 ответов

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

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

Мне как интервьюеру очень хотелось бы услышать, что существуют стандартные инструменты для парсинга CSV. Я бы особенно хотел услышать, что синтаксический анализ / обработка с нуля с использованием сценариев или утилит командной строки менее желателен, чем использование стандартных инструментов, таких как pandasи csv.

Stack Exchange не подходит для такого типа повторяющихся вопросов и ответов, поэтому вместо этого я просто опубликую ответ, используя Python, который я бы предоставил на собеседовании только после того, как действительно разберусь в бизнес-проблеме.

# Assume it's OK to import sqrt, otherwise the spirit of the problem isn't understood.
from math import sqrt

# Read data into dictionary.
dino_dict = dict()
for filename in ['file1.csv','file2.csv']:
    with open(filename) as f:
        # Read the first line as the CSV headers/labels.
        labels = f.readline().strip().split(',')

        # Read the data lines.
        for line in f.readlines():
            values = line.strip().split(',')
        
            # For each line insert the data in the dict.
            for label, value in zip(labels, values):
                if label == "NAME":
                    dino_name = value
                    if dino_name not in dino_dict:
                        dino_dict[dino_name] = dict() # New dino.
                else:
                    dino_dict[dino_name][label] = value # New attribute.

# Calculate speed and insert into dictionary.
for dino_stats in dino_dict.values():
    try:
        stride_length = float(dino_stats['STRIDE_LENGTH'])
        leg_length = float(dino_stats['LEG_LENGTH'])
    except KeyError:
        continue
    
    dino_stats["SPEED"] = ((stride_length / leg_length) - 1) * sqrt(leg_length * 9.8)
    
# Make a list of dinos with their speeds.
bipedal_dinos_with_speed = list()
for dino_name, dino_stats in dino_dict.items():
    if dino_stats.get('STANCE') == 'bipedal':
        if 'SPEED' in dino_stats:
            bipedal_dinos_with_speed.append((dino_name, dino_stats['SPEED']))

# Sort the list by speed and print the dino names.
[dino_name for dino_name, _ in sorted(bipedal_dinos_with_speed, key=lambda x: x[1], reverse=True)]

['Tyrannosaurus Rex', 'Velociraptor', 'Struthiomimus', 'Hadrosaurus']

4
18.03.2021, 23:25

A g awk, но выполняется начальная join, а затем окончательная внутренняя сортировка поawk

join -t, <(sort file1.csv) <(sort file2.csv) | 
    awk -F, -v g=9.8 '/bipedal/{osaur[$1]=($4/$2-1)*sqrt(g*$2)}
        END{PROCINFO["sorted_in"]="@val_num_desc"; for (d in osaur) print d}'

Tyrannosaurus Rex
Velociraptor
Struthiomimus
Hadrosaurus

Изменить для комментария @Cbhihe

Полезный ресурс по управлениюgawkсканированием массивов .

PROCINFO["sorted_in"]можно настроить для управления последовательностью чтения массива.

В этом случае нужно использовать @value, предполагая, что они numeric, и сортировать их по descокончанию, следовательно, @val_num_desc.

Массив также может быть выведен с использованием @indльдов, предполагая, что они являются strингами, и отсортировать их asc, заканчивающиеся, и в этом случае это было бы@ind_str_asc

Любая комбинация этих мух и все они находятся в связанном ресурсе.

2
18.03.2021, 23:25

Решение bu5hman хорошее, и его можно сделать более удобочитаемым и модифицируемым, переработав его следующим образом:

$ join -t, <(sort file1.csv) <(sort file2.csv) |
awk -F, -v g=9.8 '/bipedal/{osaur[$1]=($4/$2-1)*sqrt(g*$2);
print $1 "=" osaur[$1]; }' | sort -t= -rnk2

Результат:

Tyrannosaurus Rex=6.45447
Velociraptor=5.38445
Struthiomimus=1.37078
Hadrosaurus=0.571548

ПРИМЕЧАНИЕ. :направить приведенный выше результат в cut -d= -f1, чтобы отображались только имена.

2
18.03.2021, 23:25

Вы могли бы использовать великого Миллера и бежать

mlr --csv join -j NAME -f file1.csv \
then put '$speed=($STRIDE_LENGTH/LEG_LENGTH - 1)*pow(($LEG_LENGTH*9.8),0.5)' \
then sort -nr speed \
then cut -f NAME file2.csv

получить

NAME
Tyrannosaurus Rex
Velociraptor
Euoplocephalus
Stegosaurus
Hadrosaurus
Struthiomimus

Это инструмент, который вы можете использовать почти в каждой ОС и сценарии через bash (и другие языки сценариев ). И это как вырезать/вставить/sed/awk.

3
18.03.2021, 23:25

Для этой цели были созданы некоторые инструменты. Вот пример:

$ csvq 'select * from cities'
+------------+-------------+----------+
|    name    |  population |  country |
+------------+-------------+----------+
| warsaw     |  1700000    |  poland  |
| ciechanowo |  46000      |  poland  |
| berlin     |  3500000    |  germany |
+------------+-------------+----------+

$ csvq 'insert into cities values("dallas", 1, "america")'
1 record inserted on "C:\\cities.csv".
Commit: file "C:\\cities.csv" is updated.

https://github.com/mithrandie/csvq

4
18.03.2021, 23:25

Вы упомянули, что Python разрешен.

Это довольно просто, поскольку Python включает встроенную поддержку sqlite3. Вот ссылка на документацию :https://docs.python.org/3/library/sqlite3.html. Все, что вам нужно сделать, это создать таблицу SQL для вашего CSV-файла, используя первую строку в качестве имен столбцов, и вставить данные. Оттуда вы можете запустить столько операторов select, сколько захотите.

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

1
18.03.2021, 23:25

Теги

Похожие вопросы