Author Topic: Забрать результаты (разделенные двойными кавычками) из файла (.txt)  (Read 2680 times)

0 Members and 1 Guest are viewing this topic.

Torari

  • Зашел в гости
  • *
  • Posts: 18
    • View Profile
Доброго времени суток.

Есть .txt файл, в который записываются 5ть результатов, назовем их a,b,c,d,e. Записываются они в одну строку, разделением служат двойные кавычки и пробел (или tab). В общем виде это выглядит так: "a" "b" "c" "d" "e"

Приведу примеры:

Code: [Select]
"03/19/2014 10:08:00.928" "1.40308684" "43681" "25" "11"
"03/19/2014 10:08:40.92" "0.6242804501" "348" "672" "952"
"03/19/2014 10:07:10" "1.0929281" "68" "2572" "7"

Где
Code: [Select]
a= 03/19/2014 10:08:00.928 b = 1.40308684     c = 43681 d = 25     e = 11
a= 03/19/2014 10:08:40.92  b = 0.6242804501   c = 348   d = 672    e = 952
a= 03/19/2014 10:07:10     b = 1.0929281      c = 68    d = 2572   e = 7

Примечание - заранее длинна символов не известна для каждого значения a,b,c,d,e
Задача - извлечь a,b,c,d,e в соответствующие переменные.

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Проблема в кавычках, ими помечаются строковые значения, но сами кавычки в строках указывать нельзя.

aden

  • Оплот сообщества
  • ****
  • Posts: 363
    • View Profile
тоже на кавычки наперся и застрял )

Atas

  • Активный участник
  • ***
  • Posts: 147
    • View Profile
Для теста создаем в папке проекта текстовый файл "input.txt" с текстом из первого поста:
Quote
"03/19/2014 10:08:00.928" "1.40308684" "43681" "25" "11"
"03/19/2014 10:08:40.92" "0.6242804501" "348" "672" "952"
"03/19/2014 10:07:10" "1.0929281" "68" "2572" "7"

Забираем результаты (разделенные двойными кавычками):
Code: (clickermann) [Select]
LOGCLEAR // Очищаем лог

DEFINE($srt_n, 1) // Начнем чтение с первой строки

$srt_count = TFCOUNT("input.txt") // Количество строк во входном файле

WHILE($srt_n > $srt_count)
   HALT // Если количество проверяемых строк превышает количество строк в файле, то сценарий завершается
ELSE
   $srt = STRFILTER( TFREAD("input.txt", $srt_n), ":./ 0123456789", 1) // Считываем из файла и отфильтровываем строку
   
   //--------------------------------
   
   // Первая искомая переменная (строковое значение) состоит из двух частей, разделенных пробелом
   $a_1 = STRCONCAT (STRCUT($srt, 1, 10), " ") // Дата всегда содержит одинаковое количество символов
   $srt = STRREPLACE ($srt, $a_1, "") // Заменяем в строке первую часть переменной a пустышкой
   $a_2 = STRCUT ($srt, 1, STRPOS($srt, " ") - 1 )
   $a = STRCONCAT($a_1, "", $a_2) // Склеиваем переменную a
   
   //--------------------------------
   
   $srt = STRREPLACE ($srt, STRCONCAT($a_2, " "), "") // Отрезаем от строки остатки переменной a и пробел
   $b = STRCUT ($srt, 1, STRPOS($srt, " ") - 1 )
   
   //--------------------------------
   
   $srt = STRREPLACE ($srt, STRCONCAT($b, " "), "") // Отрезаем от строки переменную b и пробел
   $c = STRCUT ($srt, 1, STRPOS($srt, " ") - 1 )
   
   //--------------------------------
   
   $srt = STRREPLACE ($srt, STRCONCAT($c, " "), "") // Отрезаем от строки переменную c и пробел
   $d = STRCUT ($srt, 1, STRPOS($srt, " ") - 1 )
   
   //--------------------------------
   
   $srt = STRREPLACE ($srt, STRCONCAT($d, " "), "") // Отрезаем от строки переменную d и пробел
   $e = STRCUT ($srt, 1, 100) // Количество символов переменной e неизвестно, предположим, что не больше 100
   
   //-------------------------------- Выводим результаты в лог
   
   
   PRINT( STRCONCAT("a = ", $a, " b = ", $b, " c = ", $c, " d = ", $d, " e = ", $e) )
   
   INC($srt_n,1) // Переходим к следующей строке
END_CYC


Далее, можно перевести строковые  переменные $a, $b, $c, $d и $e в числовые, если это необходимо по сценарию и с ними будут производиться какие то вычисления.
« Last Edit: March 19, 2014, 10:13:00 PM by Atas »

Torari

  • Зашел в гости
  • *
  • Posts: 18
    • View Profile
Oraven, aden спасибо за комментарии.

Atas Огромное спасибо за скрипт и подробные разъяснения. Забрать результаты у меня получилось.)

PS Был приятно удивлен, как работает STRFILTER ("str", "set", mode). Его работу представлял немного иначе, исходя из примеров в мануале. Мне казалось, что маска не посимвольная, что в первом варианте
Code: [Select]
print( strfilter("hello2000", "20", 0 ) ) // результат "hello"
кликермэн ищет в тексте "двадцать"... найдя "двадцать"... вырежет и "двадцать", и все символы, которые находятся после "двадцати".

во втором варианте
Code: [Select]
print( strfilter("hello2000", "20", 1 ) ) // результат "2000"
 // результат "hello"
кликермэн ищет в тексте "двадцать"... найдя "двадцать"... оставит и "двадцать", и все символы, которые находятся после "двадцать".

А оказывается кликермэн ищет "двойки" и "нули". ;D
« Last Edit: March 21, 2014, 06:45:15 AM by Torari »