Что нового

Как определить части таблицы из буфера

And

Новичок
Сообщения
36
Репутация
0
Нужно копировать в буфер окно, где есть данные в виде таблицы
Например данные, разделенные пробелом или табом
s1c1 s1c2 s1c3
s2c1 s2c2 s2c3
s3c1 s3c2 s3c3

Как сделать, чтобы каждая ячейка соответствовала определенной переменной скрипта, если количество как строк, так и столбцов не фиксированное?

Скажите названия функций, которыми можно пользоваться, может быть уже есть готовые решения?
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
Массивы вас устроят?
Или пример приведите, что вы хотите на выходе.
 

InnI

AutoIT Гуру
Сообщения
4,982
Репутация
1,460
And
Из "правильных" таблиц, т.е. с одинаковым количеством столбцов и без пустых строк, можно сделать двумерный массив
Код:
$LineDelim = @CRLF ; разделитель строк
$ColumnDelim = " " ; разделитель столбцов

$Text = StringStripWS(ClipGet(), 2)
$Lines = StringSplit($Text, $LineDelim, 1)
$Columns = StringSplit($Lines[1], $ColumnDelim, 1)

Global $Array[$Lines[0]][$Columns[0]]
For $i = 0 To $Lines[0] - 1
  $Tmp = StringSplit($Lines[$i + 1], $ColumnDelim, 1)
  For $j = 0 To $Columns[0] - 1
    $Array[$i][$j] = $Tmp[$j + 1]
  Next
Next

#include <Array.au3>
_ArrayDisplay($Array)
Для "неправильных" таблиц нужно добавлять различные условия и дополнительные обработки.
 
Автор
A

And

Новичок
Сообщения
36
Репутация
0
Спасибо за пример, подходит. А какой командой можно проверить существует ли значение у массива $Array[0][2] или нет. В разных таблицах разное количество строк и ячеек, как написать
Допустим вывести

Код:
$Array[0][0] & @TAB &
$Array[0][1] & @TAB &
If $Array[0][2] Then $Array[0][2] EndIf & @TAB &
$Array[1][0] ; и т.д.


Т.е. если в скопиваронной таблице меньше столбцов, чем запрашивается для вывода массива, скрипт выводит ошибку после запуска.
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
Чтобы не обращаться к несуществующей ячейке массива есть команда UBound. А для того, чтобы добавлять новые строки и столбцы в массив команда ReDim
 
Автор
A

And

Новичок
Сообщения
36
Репутация
0
Не смог прицепить Ubound к примеру, не подходит нигде
Тот же массив в конце, если добавить

Код:
Ubound($Array[$i][$j], 2)

или
Код:
$Lines = Ubound(StringSplit($Text, $LineDelim, 1), 2)
$Columns = Ubound(StringSplit($Lines[1], $ColumnDelim, 1), 2)


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

edyapd

Осваивающий
Сообщения
380
Репутация
30
And сказал(а):
Код:
$Lines = Ubound(StringSplit($Text, $LineDelim, 1), 2)
$Columns = Ubound(StringSplit($Lines[1], $ColumnDelim, 1), 2)


Здесь наверно нужен большой опыт скриптования, чтобы понимать откуда и куда. Написать такое самому без опыта наверно сложно.
Требуется всего лишь внимательно читать справку. Нажмите мышкой на команду, откроется страница справки.
Читаем StringSplit - Возвращает массив, в котором по умолчанию первый элемент $aArray[0] содержит количество возвращённых строк .... Заметьте, массив одномерный. И в нём уже содержится указание на то, сколько в нём строк. Вы же с помощью команды Ubound в приведёном вами примере, пытаетесь узнать про второе измерение массива, которое отсутствует.
 

InnI

AutoIT Гуру
Сообщения
4,982
Репутация
1,460
And
В моём примере количество столбцов определяется по первой строке и находится в $Columns[0]
Таким образом последний элемент первой строки будет
Код:
$Array[0][$Columns[0] - 1]


пример не понятно как полностью работает
Код:
$LineDelim = @CRLF ; разделитель строк
$ColumnDelim = " " ; разделитель столбцов

; получаем текст из буфера обмена
$Text = ClipGet()
; удаляем все завершающие переводы строк
$Text = StringStripWS($Text, 2)
; разбиваем текст на строки по разделителю строк
$Lines = StringSplit($Text, $LineDelim, 1)
; разбиваем ПЕРВУЮ строку на столбцы по раделителю столбцов
$Columns = StringSplit($Lines[1], $ColumnDelim, 1)

; нулевые элементы массивов содержат...
; ... количество строк
$LinesCount = $Lines[0]
; ... количество столбцов
$ColumnsCount = $Columns[0]

; создаём массив по количеству строк и столбцов
Global $Array[$LinesCount][$ColumnsCount]

; заполняем массив
; перебираем строки
For $i = 0 To $LinesCount - 1
  ; разбиваем каждую строку на столбцы
  $Tmp = StringSplit($Lines[$i + 1], $ColumnDelim, 1)
  ; перебираем столбцы
  For $j = 0 To $ColumnsCount - 1
    ; заносим значение строки/столбца в элемент массива
    $Array[$i][$j] = $Tmp[$j + 1]
  Next
Next

; выводим массив
For $i = 0 To $LinesCount - 1
  For $j = 0 To $ColumnsCount - 1
    ConsoleWrite($Array[$i][$j] & " ")
  Next
  ConsoleWrite(@CRLF)
Next
 
Верх