Автоматическое обновление файла данных и отображение? - PullRequest
0 голосов
/ 24 ноября 2010

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

Мой текущий файл базы данных (seat.txt) хранится таким образом (не уверен, что это хороший формат:

X000X
00000
0XXX0

, где X означает, что сиденье занято, 0 означает, что ничто.

После того, как пользователь войдет в мою систему и выберет «Выбрать лучшее для вас», пользователю будет предложено ввести количество мест, которое он / она хочет (я сделал эту часть), теперь, если пользователь введет: 2 Я проверю из первого ряда, посмотрю, есть ли свободные места, если да, то я назначу (это простой способ, как только я получу эту работу, я напишу лучший алгоритм "автоматического бронирования")

Я пытаюсь поиграть с sed, awk, grep .. но это просто не работает (я новичок в программировании bash, только изучаю bash 3 дня назад).

Кто-нибудь может помочь?

К вашему сведению: формат seat.txt не должен быть таким. Также можно хранить все места в 1 ряду, например: X000X0XXX00XXX

Спасибо =)

Ответы [ 2 ]

1 голос
/ 24 ноября 2010

Не совсем понятно, какую помощь вы просите здесь. "Кто-нибудь может помочь?" это очень широкий вопрос.

Если вы спрашиваете, используете ли вы правильные инструменты, то да, инструменты обработки текста (sed/awk/grep и др.) Идеально подходят для этого, учитывая первоначальное требование, чтобы это было сделано в bash в первую очередь. , Я бы лично выбрал другую базовую линию, чем bash, но, если вы так решили, то с вашим выбором инструментов все в порядке.

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

I будет , вероятно, придерживаться многострочного представления данных по двум причинам. Во-первых, простой текстовый поиск двух мест вместе будет проще, если вы будете хранить ряды отдельно друг от друга. В противном случае в 5seat-by-2row XXXX00XXXX упрощенный поиск будет рассматривать эти два 0 места вместе, несмотря на тот факт, что они не находятся рядом друг с другом:

XXXX0
0XXXX

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

В качестве примера, вы можете получить передний ряд с двумя последовательными местами с (команды разбиты для удобства чтения):

pax> cat seats.txt
X000X
00000
0XXX0

pax> expr $(
     (echo '00000';cat seats.txt)
         | grep -n 00
         | tail -1
         | sed 's/:.*//'
     ) - 1
2

Магия expr и дополнительные echo гарантируют, что вы вернетесь 0, если мест нет. И вы можете получить первую позицию в этом ряду с помощью:

pax> cat seats.txt
     | grep 00
     | tail -1
     | awk '{print index($0,"00")}'
3
1 голос
/ 24 ноября 2010

Вот кое-что, с чего можно начать.Этот скрипт читает каждое место из вашего файла и отображает, занят ли он или нет, постоянно отслеживая номер строки и столбца.

#!/bin/bash

let ROW=1
let COL=1

# Read one character at a time into the variable $SEAT.
while read -n 1 SEAT; do
    # Check if $SEAT is an X, 0, or other.
    case "$SEAT" in
        # Taken.
        X)  echo "Row $ROW, col $COL is taken"
            let COL++
            ;;

        # Empty.
        0) 
            echo "Row $ROW, col $COL is EMPTY"
            let COL++
            ;;

        # Must be a new line ('\n').
        *)  let ROW++
            let COL=1
            ;;
    esac
done < seats.txt

Обратите внимание, что мы вводим seats.txt в концесценарий, а не в начале.Это странно, но для тебя это UNIX.Любопытно, что весь цикл while ведет себя как одна большая команда:

while read -n 1 SEAT; do {stuff}; done < seats.txt

В конце < в seats.txt подает цикл в целом и, в частности, команду read.

...