Что нового

[Данные, строки] Чистка массива от ненужных строк, по шаблону

op_joke

Новичок
Сообщения
20
Репутация
0
Добрый день!
Смотрите, какой вопрос появился: есть массив, он берется из файла excel. В массив читается вся книга, данными оперирую только из 5 столбцов, так вот - каждое рандомное количество строк данные массива прерываются шапокй таблицы (от такая вот беда) от нее то мне и надо избавится, а как это сделать непосредственно в массиве - осилить немогу.
Чисткой массива от пустых значений воспользовался - работает. (спасибо, madmasles)
Самые уникальные данные во втором столбце там ID начинается он с одной и той же цифры. может к нему привязаться как то?

пример табличных данных:
01. | 1011_2020 | ПО *******| 2015 *****| 2020 *****|
02. | 1011_2021 | ДО *******| 2011 *****| 2090 *****|
№ | заголовок1 | заголовок2 | заголовок3 | заголовок4 |
1* | 2******** | 3*********| 4******** | 5******** |
03. | 1011_2071 | HО *******| 2013 *****| 2099 *****|
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
op_joke,
Должны остаться только строки с 01., 02., 03.?
 
Автор
O

op_joke

Новичок
Сообщения
20
Репутация
0
madmasles сказал(а):
op_joke,
Должны остаться только строки с 01., 02., 03.?
Да, только они
Причем, есть же еще шапка сверху таблицы (отсекается диапазоном чтения) и внизу всякий мусор, в виде обычного текста. А нумерация 01. 02. 03. иногда совпадает с нумерацией колонки в шапке таблицы...
 

InnI

AutoIT Гуру
Сообщения
4,947
Репутация
1,443
op_joke
во втором столбце там ID начинается он с одной и той же цифры
Код:
Global $Tbl, $k = 0, $ID = "1011_"

#include <File.au3>
_FileReadToArray("tbl.txt", $Tbl, 0, "|")

For $i = 0 To UBound($Tbl) - 1
  If StringRegExp($Tbl[$i][1], $ID & "\d+") Then
    For $j = 0 To UBound($Tbl, 2) - 1
      $Tbl[$k][$j] = $Tbl[$i][$j]
    Next
    $k += 1
  EndIf
Next
ReDim $Tbl[$k][UBound($Tbl, 2)]

#include <Array.au3>
_ArrayDisplay($Tbl)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
op_joke,
Мой вариант:
Код:
#include <Array.au3>

Opt('MustDeclareVars', 1)

Global $aArray[5][5] = [['01.', '1011_2020', 'ПО *******', '2015 *****', '2020 *****'],['02.', '1011_2021', 'ДО *******', '2011 *****', '2090 *****'], _
		['№', 'заголовок1', 'заголовок2', 'заголовок3', 'заголовок4'],['1*', '2********', '3*********', '4********', '5********'], _
		['03.', '1011_2071', 'HО *******', '2013 *****', '2099 *****']], $sNoDel = '1011_', $iColumn = 1, $aNewArray

_ArrayDisplay($aArray, '1')
For $i = 0 To UBound($aArray) - 1
	If StringInStr($aArray[$i][$iColumn], $sNoDel) = 1 Then ContinueLoop
	$aArray[$i][$iColumn] = ''
Next
_ArrayDisplay($aArray, '2')
ConsoleWrite('_ArrayClearEmpty: ' & _ArrayClearEmpty($aArray, $iColumn) & ' del items: ' & @extended & @LF)
_ArrayDisplay($aArray, '3')

; #FUNCTION# =================================================================================================
; Name...........: _ArrayClearEmpty
; Description ...: Удаляет из массива: 1-размерного пустые строки;
;                                      2-размерного пустые строки по индексу колонки.
; Syntax.........: _ArrayClearEmpty($a_Array, $i_SubItem = 0, $i_Start = 0)
; Parameters ....: $a_Array - массив, в котором удаляются пустые строки.
;                  |$i_SubItem  - индекс колонки (у 2-размерного массива)по которой идет поиск пустых строк,
;                  по умолчанию - первая колонка.
;                  |$i_Start - индекс строки начала поиска пустых строк, по умолчанию - 0(первая строка).
; Return values .: Успех - массив без пустых строк и @error = 0 и
;                  @extended - количество удаленных пустых строк.
;                  Неудача - 0 и @error = :
;                  | 1 - $a_Array не является массивом или его размерность больше 2
;                  | 2 - в 1-размерном массиве все строки пустые (см. Remarks);
;                        в 2-размерном массиве все строки пустые по индексу колонки $i_SubItem (см. Remarks).
; Author ........: madmasles (функция), идея: Yashied http://autoit-script.ru/index.php?topic=1905.msg13688#msg13688
; Remarks .......: если $i_Start > 0 и все строки, начиная с $i_Start пустые, то вернет массив со строками
;                  с 0 по $i_Start - 1 и @error = 0.
;                  Числовое значение строки 0 не считается пустым значением.
; ============================================================================================================
Func _ArrayClearEmpty(ByRef $a_Array, $i_SubItem = 0, $i_Start = 0)
	If Not IsArray($a_Array) Or UBound($a_Array, 0) > 2 Then Return SetError(1, 0, 0)

	Local $i_Index = -1
	Local $i_UBound_Row = UBound($a_Array, 1) - 1
	Local $i_UBound_Column = UBound($a_Array, 2) - 1
	Local $a_TempArray[1]
	If $i_UBound_Column = -1 Then $i_UBound_Column = 0
	If $i_SubItem > $i_UBound_Column Then $i_SubItem = 0
	If $i_Start < 0 Or $i_Start > $i_UBound_Row Then $i_Start = 0

	Switch $i_UBound_Column + 1
		Case 1
			ReDim $a_TempArray[$i_UBound_Row + 1]
			If $i_Start Then
				For $i = 0 To $i_Start - 1
					$a_TempArray[$i] = $a_Array[$i]
				Next
				$i_Index = $i_Start - 1
			EndIf
			For $i = $i_Start To $i_UBound_Row
				If String($a_Array[$i]) Then
					$i_Index += 1
					$a_TempArray[$i_Index] = $a_Array[$i]
				EndIf
			Next
			If $i_Index > -1 Then
				ReDim $a_TempArray[$i_Index + 1]
			Else
				Return SetError(2, 0, 0)
			EndIf
		Case Else
			ReDim $a_TempArray[$i_UBound_Row + 1][$i_UBound_Column + 1]
			If $i_Start Then
				For $i = 0 To $i_Start - 1
					For $j = 0 To $i_UBound_Column
						$a_TempArray[$i][$j] = $a_Array[$i][$j]
					Next
				Next
				$i_Index = $i_Start - 1
			EndIf
			For $i = $i_Start To $i_UBound_Row
				If String($a_Array[$i][$i_SubItem]) Then
					$i_Index += 1
					For $j = 0 To $i_UBound_Column
						$a_TempArray[$i_Index][$j] = $a_Array[$i][$j]
					Next
				EndIf
			Next
			If $i_Index > -1 Then
				ReDim $a_TempArray[$i_Index + 1][$i_UBound_Column + 1]
			Else
				Return SetError(2, 0, 0)
			EndIf
	EndSwitch
	$a_Array = $a_TempArray
	Return SetExtended($i_UBound_Row - $i_Index, 1)
EndFunc   ;==>_ArrayClearEmpty
Код:
#include <Array.au3>

Opt('MustDeclareVars', 1)

Global $aArray[6][5] = [['Шапка'],['01.', '1011_2020', 'ПО *******', '2015 *****', '2020 *****'],['02.', '1011_2021', 'ДО *******', '2011 *****', '2090 *****'], _
		['№', 'заголовок1', 'заголовок2', 'заголовок3', 'заголовок4'],['1*', '2********', '3*********', '4********', '5********'], _
		['03.', '1011_2071', 'HО *******', '2013 *****', '2099 *****']], $sNoDel = '1011_', $iColumn = 1, $aNewArray

_ArrayDisplay($aArray, '1')
For $i = 1 To UBound($aArray) - 1
	If StringInStr($aArray[$i][$iColumn], $sNoDel) = 1 Then ContinueLoop
	$aArray[$i][$iColumn] = ''
Next
_ArrayDisplay($aArray, '2')
ConsoleWrite('_ArrayClearEmpty: ' & _ArrayClearEmpty($aArray, $iColumn, 1) & ' del items: ' & @extended & @LF)
_ArrayDisplay($aArray, '3')
 
Автор
O

op_joke

Новичок
Сообщения
20
Репутация
0
InnI link, спасибо, работает
madmasles, спасибо, работает
Тема решена :smile:
 
Верх