Delphi - указанная пользователем обработка строк - PullRequest
4 голосов
/ 07 марта 2011

У меня проблема в Delphi7. Мое приложение создает видеофайлы mpg в соответствии с установленным соглашением об именах, т.е.

\ 000_A_Title_YYYY-ММ-DD_HH мм ss_Index.mpg

В этом имени файла применяются следующие правила:

000 - это видео последовательность. Увеличивается всякий раз, когда пользователь нажимает «Стоп».

A (или B, C, D) указывает записывающую камеру - поэтому видеофайлы связаны с максимум четырьмя видеопотоками, которые воспроизводятся одновременно.

Title - строка переменной длины. В моем приложении он не может содержать _.

YYYY-MM-DD_HH-mm-ss - это время начала видеопоследовательности (не одного файла)

Index является индексом порядка нуля и увеличивается в течение 1 видеопоследовательности. То есть видеофайлы имеют максимальную продолжительность 15 минут, как только это достигается, новый видеофайл запускается с тем же порядковым номером, но со следующим индексом. Используя это, мы можем вычислить фактическое время начала файла (Filename decoded time + 15*Index)

Используя этот метод, мое приложение может извлечь время начала записи видеофайла.

Теперь у нас есть еще одно требование для обработки произвольно названных видеофайлов. Единственное, что я точно знаю, это то, что где-то в имени файла будет ГГГГ-ММ-ДД ЧЧ-мм-сс.

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

Итак, если пользователь вводит ?_(Camera)_*_YYYY-MM-DD_HH-mm-ss_(Index).mpg в текстовое поле, как мне узнать время начала? Есть ли лучшее решение? Или мне просто нужно использовать каждую возможность, когда мы сталкиваемся с ними?

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

Ответы [ 3 ]

4 голосов
/ 07 марта 2011

Я не уверен, пытаетесь ли вы проанализировать пользовательский ввод в компонентах? чтобы получить дату и время примерно так, дата в группе 1, время в группе 2

(\d{4}-\d{2}-\d{2})_(d{2}-\d{2}-\d{2})

В противном случае, не уверены, что вы пытаетесь сделать.

3 голосов
/ 08 марта 2011

Возможно, вы можете использовать подчеркивание "_" в качестве вашего позиционного индикатора, так как вы умело не допускаете их в заголовке.

В вашем примере соглашения об именах файлов:

?_(Camera)_*_YYYY-MM-DD_HH-mm-ss_(Index).mpg 

Вы можете проанализировать эту пользовательскую строку, чтобы увидеть, что дата YYYY-MM-DD всегда находится между 3-м и 4-м подчеркиванием, а время ЧЧ-мм-сс - между 4-м и 5-м.

Тогда этостановится простым делом при получении фактических имен файлов в соответствии с этим соглашением найти 3-е подчеркивание и узнать дату и время после него.

1 голос
/ 08 марта 2011

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

Если вы хотите счастливых пользователей и хорошего ночного сна, тогда будьте креативны и отбросьте скучный RegEx-подход.Создайте свой собственный файл-декодер, используя подход Angry Bird.

Вот идея:

  • Создайте несколько птиц с разными личностями манипуляции со строками.
  • Позвольте пользователювыберите и расположите этих птиц.
  • Выполните пользовательские манипуляции со строками.

Пример кода:

program AngryBirdFilenameDecoder;

{$APPTYPE CONSOLE}

uses
  SysUtils;

procedure PerformEatUntilDash(var aStr: String);
begin
  if Pos('-', aStr) > 0 then
    Delete(aStr, 1, Pos('-', aStr));
  WriteLn(':-{   >   ' + aStr);
end;

procedure PerformEatUntilUnderscore(var aStr: String);
begin
  if Pos('_', aStr) > 0 then
    Delete(aStr, 1, Pos('_', aStr));
  WriteLn(':-/   >   ' + aStr);
end;

function FetchDate(var aStr: String): String;
begin
  Result := Copy(aStr, 1, 10);
  Delete(aStr, 1, 10);
  WriteLn(':-)   >   ' + aStr);
end;



var
  i: Integer;
  FileName:      String;
  TempFileName:  String;
  SelectedBirds: String;
  MyDate:        String;
begin
  Write('Enter a filename to decode (eg. ''01-ThisIsAText-Img_01-Date_2011-03-08.png''): ');
  ReadLn(FileName);
  if FileName = '' then
    FileName := '01-ThisIsAText-Img_01-Date_2011-03-08.png';



  repeat
    TempFileName := FileName;
    WriteLn('Now, select some birds:');
    WriteLn('Bird No.1  :-{  ==> I''ll eat letters until I find a dash (-)');
    WriteLn('Bird No.2  :-/  ==> I''ll eat letters until I find a underscore (_)');
    WriteLn('Bird No.3  :-)  ==> I''ll remember the date before I eat it');
    WriteLn;
    Write('Chose your birds: (eg. 112123):');
    ReadLn(SelectedBirds);
    if SelectedBirds = '' then
      SelectedBirds := '112123';

    for i := 1 to Length(SelectedBirds) do
    case SelectedBirds[i] of
      '1': PerformEatUntilDash(TempFileName);
      '2': PerformEatUntilUnderscore(TempFileName);
      '3': MyDate := FetchDate(TempFileName);
    end;


    WriteLn('Bird No.3 found this date: ' + MyDate);
    WriteLn;
    WriteLn;
    Write('Check filename with some other birds? (Y/N): ');
    ReadLn(SelectedBirds);
  until (Length(SelectedBirds)=0) or (Uppercase(SelectedBirds[1])<>'Y');
end.

Когда вы сделаете это в Delphi с GUIВы добавите больше птиц и, конечно, больше проверяете.И найдите несколько красивых глифов птиц.

Используйте два списка.Один слева со всеми возможными птицами, а другой справа со всеми выбранными птицами.Drag'n'drop птиц слева направо.Переставьте (и удалите) птиц в списке справа.

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

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