Что нового

Связать строки по ключевому полю

pad0nak66

Новичок
Сообщения
23
Репутация
2
Доброго времени суток, уважаемые форумчане. Вынужден обратиться к вам за помощью, потому как сам запутался основательно.

В общем, имеется текстовый файл примерно такого плана...
Код:
1|строка1
2|строка2
3|строка3
7|строка4
2|строка5
6|строка6
7|строка7
2|строка8
9|строка9

Необходимо содержимое этого файла записать в массив, но не просто записать а сгруппировать по ключевому полю (то, что левее "|") чтобы получилось примерно следующее...
Код:
$array[0][0] = "1"
$array[0][1] = "строка1"
$array[1][0] = "2"
$array[1][1] = "строка2,строка5,строка8"
$array[2][0] = "3"
$array[2][1] = "строка3"
$array[3][0] = "6"
$array[3][1] = "строка6"
$array[4][0] = "7"
$array[4][1] = "строка4,строка7"
$array[5][0] = "9"
$array[5][1] = "строка9"

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

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Код:
Local $_sRead = FileRead()
Local $_aRead = StringSplit( StringStripCR( $_sRead ), @LF)
Local $_aResult[1][2] = [ [ 0 ] ], $_aTmp

For $Idx = 1 To $_aRead[0] Step 1
   $_aTmp = StringRegExp( $_aRead[$Idx], '([0-9]+)\|(.+)', 3 )
   If $_aTmp[0] > $_aResult[0][0] Then
      ReDim $_aResult[$_aTmp[0]+1][2]
      For $Idx2 = $_aResult[0][0]+1 To $_aTmp[0]
         $_aResult[$Idx2][0] = 0
         $_aResult[$Idx2][1] = ''
      Next
      $_aResult[0][0] = $_aTmp[0]
   EndIf
   If Not $_aResult[$_aTmp[0]][0] Then
      $_aResult[$_aTmp[0]][0] = $_aTmp[0]
      $_aResult[$_aTmp[0]][1] = $_aTmp[1]
   Else
      $_aResult[$_aTmp[0]][1] &= ',' & $_aTmp[1]
   EndIf
Next


Номер будет соответствовать номеру ячейки.
Если же вариант массива на выходе не устраивает, то пройдись по результату этим:
http://autoit-script.ru/index.php?topic=1905.msg13688#msg13688

*Исправил
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
pad0nak66

Мой вариант:

Код:
#include <Array.au3>

$sText = FileRead('1.txt')

$aTemp = StringRegExp($sText, '(.*?)\|', 3)
$aTemp = _ArrayUnique($aTemp)

_ArrayDelete($aTemp, 0)
_ArraySort($aTemp)

Dim $aText[UBound($aTemp)][2]

For $i = 0 To UBound($aTemp) - 1
	$aText[$i][0] = '"' & $aTemp[$i] & '"'
	$a = StringRegExp($sText, $aTemp[$i] & '\|(.+)', 3)
	$aText[$i][1] = '"' & _ArrayToString($a, ',') & '"'
Next

_ArrayDisplay($aText)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
И ещё вариант:

Код:
#include <Array.au3>

$vTest = FileRead('Lines.txt')

$aRet = StringRegExp($vTest, '\b(\d)\|(.+)\b', 3)

$iC = 0
$iUbnd = UBound($aRet)
Dim $aArray[1][2]

For $i = 1 To $iUbnd-1 Step 2
	If $aRet[$i-1] = '' Then
		ContinueLoop
	EndIf
	
	$aArray[$iC][0] = $aRet[$i-1]
	$aArray[$iC][1] = $aRet[$i]
	
	For $j = $i+1 To $iUbnd-1 Step 2
		If $aRet[$i-1] = $aRet[$j] Then
			$aArray[$iC][1] &= ',' & $aRet[$j+1]
			$aRet[$j] = ''
		EndIf
	Next
	
	$iC += 1
	
	If $i < $iUbnd-1 Then
		ReDim $aArray[$iC+1][2]
	EndIf
Next

_ArrayDisplay($aArray)
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Код:
$sLine = FileRead('test.txt')
$iCount = UBound(StringRegExp($sLine, '(?m)^(.?)', 3))
Dim $aArr[$iCount][2], $iReDim

For $i = 0 To $iCount
	$aTmp = StringRegExp($sLine, $i+1 & '[?:|](.+)\b', 3)
	If IsArray($aTmp) Then
		For $j = 0 To UBound($aTmp)-1
			$aArr[$iReDim][0]  = $i+1
			$aArr[$iReDim][1] &= $aTmp[$j] & Chr(32)
		Next
		$iReDim +=1
	Else
		ContinueLoop
	EndIf
Next

ReDim $aArr[$iReDim][2]
_ArrayDisplay($aArr)
 
Автор
P

pad0nak66

Новичок
Сообщения
23
Репутация
2
Благодарю всех за участие!

Ближе всех по решению оказался WSWR. И коротко и по делу ;D
 
Верх