Sign in to follow this  
Followers 0
Zedna

_ArrayToString2D() and _ArrayToHtml2D()

4 posts in this topic

#1 ·  Posted (edited)

There is _ArrayToString() in standard Array.au3 include file but it's only for one dimensional arrays.

In one of my projects I needed it for two dimensional arrays obtained from Internet Explorer (by IE UDF)

so I have created _ArrayToString2D() and derived _ArrayToHtml2D()

Func _ArrayToString2D(Const ByRef $avArray, $sDelimCol = "|", $sDelimRow = @CRLF, $iStart = 0, $iEnd = 0)

Func _ArrayToHtml2D(Const ByRef $avArray, $attrib = 'border="1"', $iStart = 0, $iEnd = 0)

Here it is also with simple example:

#Include <IE.au3>
;~ #Include <Array.au3>

$html_src = _
'<html>' & _
'<table border="1">' & _
'<tr>' & _
'<td>row 1 col 1</td>' & _
'<td>row 1 col 2</td>' & _
'</tr>' & _
'<tr>' & _
'<td>row 2 col 1</td>' & _
'<td>row 2 col 2</td>' & _
'</tr>' & _
'<tr>' & _
'<td>row 3 col 1</td>' & _
'<td>row 3 col 2</td>' & _
'</tr>' & _
'</table>' & _
'</html>'

$oIE = _IECreate("about:blank")
_IEBodyWriteHTML($oIE, $html_src)
$oTable = _IETableGetCollection ($oIE, 0)
$aTableData = _IETableWriteToArray($oTable, True)
;~ _ArrayDisplay($aTableData, 'Table')

$csv = _ArrayToString2D($aTableData, ';', @CRLF) 
FileSaveAndOpen('_ArrayToString2D.csv', $csv)

$html = _ArrayToHtml2D($aTableData) 
$html = '<html>' & @CRLF & $html & '</html>'
FileSaveAndOpen('_ArrayToHtml2D.html', $html)

Func FileSaveAndOpen($file, $content)
 $file = @TempDir & '\' & $file
 FileDelete($file)
 FileWrite($file, $content)
 ShellExecute($file)
EndFunc

; based on _ArrayToString(), unlike _ArrayToString() this works for two dimensional array (only)
Func _ArrayToString2D(Const ByRef $avArray, $sDelimCol = "|", $sDelimRow = @CRLF, $iStart = 0, $iEnd = 0) 
 If Not IsArray($avArray) Then Return SetError(1, 0, "")
 If UBound($avArray, 0) <> 2 Then Return SetError(2, 0, "")

 Local $sResult, $iUBound = UBound($avArray) - 1

 ; Bounds checking
 If $iEnd < 1 Or $iEnd > $iUBound Then $iEnd = $iUBound
 If $iStart < 0 Then $iStart = 0
 If $iStart > $iEnd Then Return SetError(3, 0, "")

 ; Combine
 For $i = $iStart To $iEnd ; rows
    For $j = 0 To UBound($avArray,2) - 1 ; columns
        $sResult &= $avArray[$i][$j] & $sDelimCol
    Next
    $sResult = StringTrimRight($sResult, StringLen($sDelimCol))
    $sResult &= $sDelimRow
 Next

 Return StringTrimRight($sResult, StringLen($sDelimRow))
EndFunc

; based on _ArrayToString2D()
Func _ArrayToHtml2D(Const ByRef $avArray, $attrib = 'border="1"', $iStart = 0, $iEnd = 0) 
 If Not IsArray($avArray) Then Return SetError(1, 0, "")
 If UBound($avArray, 0) <> 2 Then Return SetError(2, 0, "")

 Local $sResult, $iUBound = UBound($avArray) - 1
 Local $row, $sDelimCol = "</td>" & @CRLF, $sDelimRow = '</tr>' & @CRLF

 ; Bounds checking
 If $iEnd < 1 Or $iEnd > $iUBound Then $iEnd = $iUBound
 If $iStart < 0 Then $iStart = 0
 If $iStart > $iEnd Then Return SetError(3, 0, "")

 $sResult = '<table ' & $attrib & '>' & @CRLF
 
 ; Combine
 For $i = $iStart To $iEnd ; rows
    $row = '<tr>' & @CRLF
    For $j = 0 To UBound($avArray,2) - 1 ; columns
        $row &= '<td>' & $avArray[$i][$j] & $sDelimCol
    Next
    $sResult &= $row & $sDelimRow
 Next
 
 Return $sResult & '</table>' & @CRLF
EndFunc

EDIT: removed commas from $html_src

Edited by Zedna

Share this post


Link to post
Share on other sites



#2 ·  Posted (edited)

That's really cool. There has been a similar discussion in But your script is very interesting and practical. Thanks.

Edit

I just noticed that the excel example didn't come out exactly the same as the html table. Perhaps you need to check that.

Edited by czardas

Share this post


Link to post
Share on other sites

#3 ·  Posted (edited)

Edit

I just noticed that the excel example didn't come out exactly the same as the html table. Perhaps you need to check that.

For me it works OK.

You may try to remove "," (commas) from $html_src

so instead of "row 1, col 1" put only "row 1 col 1".

--> I removed it from example in first post

Also look at CSV file in TEMP directory if it's OK, maybe it's only some display problem in Excel.

Edited by Zedna

Share this post


Link to post
Share on other sites

I changed the separator in line 28 from a semicolon to a comma, and now it works perfectly. I guess csv files are interpreted differently depending on settings in excel. I'll have to investigate that.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0