Форматирование данных и ввод в базу данных на Java

Я получаю данные об оборудовании из cmd, используя построитель процессов в java.

//get info from cmd
    ProcessBuilder processBuilder = new ProcessBuilder();

        processBuilder.command("cmd.exe", "/c", "systeminfo ");

        try {

            Process process = processBuilder.start();

            BufferedReader reader =
                    new BufferedReader(new InputStreamReader(process.getInputStream()));
            //write the output to the variables
            String line;
            //a loop which ensures all the data is read in
            while ((line = reader.readLine()) != null) {
                hardwareInfo.add(line);//hardwareInfo is an arraylist i currently save all this information to
            }

Это возвращает всю соответствующую информацию и многое другое. мой вывод выглядит следующим образом:

[, Host Name:                 LJDESKTOP, OS Name:                   Microsoft Windows 10 Education, OS Version:                10.0.18363 N/A Build 18363

и т. д...

Я хочу добавить некоторые из этих полей в базу данных SQL на основе их имен (например, имя хоста: - да, имя ОС: - нет). Соединение SQL настроено. Мне просто нужно найти лучший способ сохранить эти переменные, чтобы я мог вставить их прямо в свою базу данных.

Итак, как мне избавиться от Host Name: и по-прежнему вводить LJDESKTOP в свою базу данных, и тот же принцип для остальной информации, которую я получаю от команды cmd.

Я также пытаюсь учитывать эффективность, я хочу, чтобы это было как можно более «легким» в вычислительном отношении, но это не обязательно.

Что я пробовал до сих пор:

  1. Я попытался разбить строку на «:» для каждой переменной и обрезки. Это дает мне именно ту информацию, которая мне нужна, но я не могу сохранить ее в отдельных переменных. Это потому, что бит, который я обрезал, определяет, какие у меня переменные. (Могу ли я потенциально добавить функцию обрезки в мой сеттер?)

  2. Я пытался:

    в то время как ((строка = reader.readLine()) != ноль) {

        if (line.startsWith("Host Name:")) {
            setHostname(line.replaceFirst("Host Name: ", ""));}
    

операторы if повторяются для каждой переменной, однако каждый раз, когда это добавляет каждую переменную в мой массив каждый раз, когда она проходит через цикл while.

Итак, что вы пробовали до сих пор?

Scary Wombat 22.12.2020 02:45

Отвечает ли это на ваш вопрос? Как получить идентификатор вставки в JDBC?

user14251453 22.12.2020 02:47

Похоже, он может использовать некоторый синтаксический анализ строк. Отбросьте «[», разделите строку запятой, чтобы получить «Имя хоста: LJDESKTOP», разделите на «:», чтобы получить пары «Имя хоста», «LJDESKTOP», разделите строки, чтобы избавиться от пробелов до и после, и вы получите «Имя хоста», «LJDESKTOP». В этот момент вы сможете сравнить свои ключи (например, «Имя хоста») и выяснить, где разместить значение (например, «LJDESKTOP») в вызовах JDBC.

vc669 22.12.2020 03:07

@SaahilMalhotra Нет, я не верю, что это отвечает на мой вопрос, поскольку я не получаю информацию из своей базы данных. Я получаю информацию со своего компьютера, а затем хочу ввести ее в свою базу данных в зависимости от имени поля, возвращаемого cmd.

LiamWBA 22.12.2020 03:16

@ vc669 извините, я, вероятно, очень плохо объясняю это, но да, я думаю, что это правильное решение, как я считаю, но я не знаю кода для этого. Если вы можете дать мне несколько минут, я опубликую то, что я пробовал до сих пор. Также мне нужно сохранить его как переменную, прежде чем я это сделаю, что добавляет дополнительную сложность, я не могу понять... сохраните LJDESKTOP как переменную «имя хоста» (без «Имени хоста:»), затем введите значение этой переменной в моя база данных.

LiamWBA 22.12.2020 03:22

@ScaryWombat Я отредактирую свой пост, чтобы рассказать вам, что я уже пробовал. Дай мне пару минут.

LiamWBA 22.12.2020 03:24

@LiamWBA вам не нужно хранить его в переменной с именем hostname. Вот некоторый псевдокод, вместо этого вы можете просто сделать что-то вроде if ( key matches "Host name:") db.put("host_name",value) в зависимости от ваших реальных переменных. На практике это может привести к switch.

vc669 22.12.2020 03:45

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

Basil Bourque 22.12.2020 07:47

@BasilBourque Я уже пробовал, по какой-то причине он не распознавал пробелы как пробелы. Я думаю, это связано с форматом, который выводит CMD. Поэтому я подумал, что было бы уместно включить построитель процессов, чтобы вы знали, откуда я беру информацию.

LiamWBA 22.12.2020 13:33
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
10
100
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете попробовать это так:

...
final Map<String,String> inputValues = new HashMap<>();

//a loop which ensures all the data is read in
while ((line = reader.readLine()) != null) {
  // Read each line as key and value into a the inputValues map

  final String[] pieces = line.split(":",2); // only split at the first ':'!

  // Was a ':' found, e.g. the string split into two pieces?
  if ( pieces.length > 1 ) {

    String key = pieces[0]; // e.g. "Host Name"
    String value = pieces[1]; // e.g. "                 LJDESKTOP"

    value = value.trim(); // remove leading/trailing whitespaces from value

    inputValues.put(key,value); // Store key+value to map.
  }
}

// Now we can access the input values by key, e.g.:

String hostName = inputValues.get("Host Name");
String osName = inputValues.get("OS Name");

// To do: Do something with the values above, e.g. send to DB...

Спасибо, похоже, хеш-карта - это то, что я искал. это тоже очень аккуратно!

LiamWBA 22.12.2020 13:34

Другие вопросы по теме