kk_lee69 发表于 2017-6-26 09:55:00

回复 15# joint


    請問前面这段代码中$i、$j在每个时间段都是不固定的這句話中

$i、$j是誰的變量??是 PYTHON 的 還是 AU3 的??

是 PYTHON 傳遞過來的嗎??

joint 发表于 2017-6-26 10:06:11

回复joint


    請問前面这段代码中$i、$j在每个时间段都是不固定的這句話中

$i、$j是誰的 ...
kk_lee69 发表于 2017-6-26 09:55 http://www.autoitx.com/images/common/back.gif

这里就当作是独立第三方的吧,可能python,也可能AU3。

kk_lee69 发表于 2017-6-26 10:09:50

回复 17# joint


    不好意思   我想解決問題   得就實際狀況來說.............

既然 你的問題都是假設........... 那就假設 高手出現 幫忙你解決問題吧

我無法 解決了............

joint 发表于 2017-6-26 10:23:02

回复 18# kk_lee69


实际需求就是这样的情况,数据来源会不同,可以被_ArrayDisplay($array)同样的显示,但数据的行、列、值都是动态变化的呀。

tubaba 发表于 2017-6-27 09:47:55

回复 19# joint


这里的$i,$j,都是UBound函数得到的结果,所以你无需理会这个值究竟是多少.ArrayDisplay是一个用来显示数组的函数,它本身不是一个数组的表达方式.你只要调用_SaveToCsv($aArray, $sCsvSavePath),自然会把$aArray数组以文件的形式存储在sCsvSavePath路径中,明白了吗?

tubaba 发表于 2017-6-27 09:48:16

本帖最后由 tubaba 于 2017-6-27 10:11 编辑

有问题不要私信.谢谢

#include <Array.au3>
Local $a = Random(1, 10, 1) ;产生从1-10随机整数,做为数组第一维长度
Local $b = Random(1, 10, 1) ;产生从1-10随机整数,做为数组第二维长度
Local $array[$a][$b] ;定义数组

For $i = 0 To UBound($array, 1) - 1
        For $j = 0 To UBound($array, 2) - 1
                $array[$i][$j] = '$array数据[$' & $i & '][$' & $j & ']'
        Next
Next

_SaveToCsv1($array, @ScriptDir & '\out.csv')        ;写入文件
Local $out = _SaveToCsv2($array);放入字符串变量
MsgBox(0, 0, $out)        ;显示这个字符串变量

Func _SaveToCsv1($aArray, $sCsvSavePath)
        Local $csv = FileOpen($sCsvSavePath, 2 + 8)
        If UBound($aArray, 0) = 1 Then
                For $i = 0 To UBound($aArray) - 1
                        Local $sStr = '"' & StringReplace($aArray[$i][$j], '"', '""') & '"'
                        FileWriteLine($csv, $sStr)
                Next
        ElseIf UBound($aArray, 0) = 2 Then
                For $i = 0 To UBound($aArray, 1) - 1
                        Local $sStr = ''
                        For $j = 0 To UBound($aArray, 2) - 1
                                $sStr &= '"' & StringReplace($aArray[$i][$j], '"', '""') & '",'
                        Next
                        $sStr = StringTrimRight($sStr, 1)
                        FileWriteLine($csv, $sStr)
                Next
        EndIf
        FileClose($csv)

EndFunc   ;==>_SaveToCsv1

;如果不想写到文件,放入一个字符串变量,那么,如下
Func _SaveToCsv2($aArray)
        Local $AllData = '' ;定义一个空字串,接收数据
        If UBound($aArray, 0) = 1 Then
                For $i = 0 To UBound($aArray) - 1
                        Local $sStr = '"' & StringReplace($aArray[$i][$j], '"', '""') & '"'
                        $AllData &= $sStr & @CRLF
                Next
        ElseIf UBound($aArray, 0) = 2 Then
                For $i = 0 To UBound($aArray, 1) - 1
                        Local $sStr = ''
                        For $j = 0 To UBound($aArray, 2) - 1
                                $sStr &= '"' & StringReplace($aArray[$i][$j], '"', '""') & '",'
                        Next
                        $sStr = StringTrimRight($sStr, 1)
                        $AllData &= $sStr & @CRLF
                Next
                $AllData = StringTrimRight($AllData, 1)
        EndIf
        Return $AllData
EndFunc   ;==>_SaveToCsv2

joint 发表于 2017-6-27 10:12:57

本帖最后由 joint 于 2017-6-27 10:26 编辑

回复joint
这里的$i,$j,都是UBound函数得到的结果,所以你无需理会这个值究竟是多少.ArrayDisplay是 ...
tubaba 发表于 2017-6-27 09:47 http://www.autoitx.com/images/common/back.gif

谢谢,本来也认为应该是这样的,但是加入数据部分后运行时提示:warning: $j: possibly used before declaration. 因为原数据部分的代码是通过
For $i = 0 To $iItemCount - 1取得,有$i但没有$j,所以才考虑上述的错误提示是否是由变量应用场景的不一致造成的。
原数据部分:
For $i = 0 To $iItemCount - 1
        $aText[$i] = ControlListView('', '', 1703, 'GetText', $i, 0)
        $aText[$i] = ControlListView('', '', 1703, 'GetText', $i, 1)
        $aText[$i] = ControlListView('', '', 1703, 'GetText', $i, 2)
        $aText[$i] = ControlListView('', '', 1703, 'GetText', $i, 3)
        $aText[$i] = ControlListView('', '', 1703, 'GetText', $i, 4)
Next
_ArrayDisplay($aText)

tubaba 发表于 2017-6-27 10:22:00

回复 22# joint


    好吧,我就问你一句,你这个$iItemCount是怎么得到的?这个相当于数组第一维,但你第二维没有定义啊,
既然有$iItemCount,那怎么没有$iColumnCount来定义第二维呢?

joint 发表于 2017-6-27 10:27:15

本帖最后由 joint 于 2017-6-27 10:34 编辑

回复joint


    好吧,我就问你一句,你这个$iItemCount是怎么得到的?这个相当于数组第一维,但你第二维 ...
tubaba 发表于 2017-6-27 10:22 http://www.autoitx.com/images/common/back.gif

原数据部分:
For $i = 0 To $iItemCount - 1
        $aText[$i] = ControlListView('', '', 1703, 'GetText', $i, 0)
        $aText[$i] = ControlListView('', '', 1703, 'GetText', $i, 1)
        $aText[$i] = ControlListView('', '', 1703, 'GetText', $i, 2)
        $aText[$i] = ControlListView('', '', 1703, 'GetText', $i, 3)
        $aText[$i] = ControlListView('', '', 1703, 'GetText', $i, 4)
Next
_ArrayDisplay($aText)

如果原数据是通过
For $i =
      For $j =
                $array[$i][$j]
方式得到的就没有问题。

tubaba 发表于 2017-6-27 10:34:27

本帖最后由 tubaba 于 2017-6-27 10:37 编辑

再不明白,我建议好好学习数组方面的基本知识
#include <Array.au3>
For $i = 0 To $iItemCount - 1
      $aText[$i] = ControlListView('', '', 1703, 'GetText', $i, 0)
      $aText[$i] = ControlListView('', '', 1703, 'GetText', $i, 1)
      $aText[$i] = ControlListView('', '', 1703, 'GetText', $i, 2)
      $aText[$i] = ControlListView('', '', 1703, 'GetText', $i, 3)
      $aText[$i] = ControlListView('', '', 1703, 'GetText', $i, 4)
Next
_ArrayDisplay($aText);我不管你前面的代码,我只是假设你得到了$aText这个数组


_SaveToCsv1($aText, @ScriptDir & '\out.csv')    ;写入文件
Local $out = _SaveToCsv2($aText);放入字符串变量
MsgBox(0, 0, $out)      ;显示这个字符串变量

Func _SaveToCsv1($aArray, $sCsvSavePath)
      Local $csv = FileOpen($sCsvSavePath, 2 + 8)
      If UBound($aArray, 0) = 1 Then
                For $i = 0 To UBound($aArray) - 1
                        Local $sStr = '"' & StringReplace($aArray[$i][$j], '"', '""') & '"'
                        FileWriteLine($csv, $sStr)
                Next
      ElseIf UBound($aArray, 0) = 2 Then
                For $i = 0 To UBound($aArray, 1) - 1
                        Local $sStr = ''
                        For $j = 0 To UBound($aArray, 2) - 1
                              $sStr &= '"' & StringReplace($aArray[$i][$j], '"', '""') & '",'
                        Next
                        $sStr = StringTrimRight($sStr, 1)
                        FileWriteLine($csv, $sStr)
                Next
      EndIf
      FileClose($csv)

EndFunc   ;==>_SaveToCsv1

;如果不想写到文件,放入一个字符串变量,那么,如下
Func _SaveToCsv2($aArray)
      Local $AllData = '' ;定义一个空字串,接收数据
      If UBound($aArray, 0) = 1 Then
                For $i = 0 To UBound($aArray) - 1
                        Local $sStr = '"' & StringReplace($aArray[$i][$j], '"', '""') & '"'
                        $AllData &= $sStr & @CRLF
                Next
      ElseIf UBound($aArray, 0) = 2 Then
                For $i = 0 To UBound($aArray, 1) - 1
                        Local $sStr = ''
                        For $j = 0 To UBound($aArray, 2) - 1
                              $sStr &= '"' & StringReplace($aArray[$i][$j], '"', '""') & '",'
                        Next
                        $sStr = StringTrimRight($sStr, 1)
                        $AllData &= $sStr & @CRLF
                Next
                $AllData = StringTrimRight($AllData, 1)
      EndIf
      Return $AllData
EndFunc   ;==>_SaveToCsv2

joint 发表于 2017-6-27 10:36:04

回复 25# tubaba

知道了,谢谢。

tubaba 发表于 2017-6-27 10:44:14

自定义函数内部的变量不用你操心,你要关心的是正确的传入参数就可以了!我不明白你要管那个$i,$j干什么.把你的数组直接代入_SaveToCsv1($aArray, $sCsvSavePath),把参数正确传递不就行了

joint 发表于 2017-6-27 11:08:47

再不明白,我建议好好学习数组方面的基本知识
tubaba 发表于 2017-6-27 10:34 http://www.autoitx.com/images/common/back.gif

非常感谢,虽然代码编译时和原来的情况一样:

但下面的放入字符变量的情况应该更符合需求,实际上数据转为csv格式是想用python的pandas模块引入的,既然已经转为csv格式的变量,要想直接在内存中引用该数据应该通过什么方式?把代码编译为exe文件被python调用是否可行?谢谢。

joint 发表于 2017-6-27 11:15:52

自定义函数内部的变量不用你操心,你要关心的是正确的传入参数就可以了!我不明白你要管那个$i,$j干什么.把你 ...
tubaba 发表于 2017-6-27 10:44 http://www.autoitx.com/images/common/back.gif

是啊,应该是两件具体过程之间毫无关系,只是结果传递后的转换问题,所以很奇怪编译时为什么总是报错。具体情况见上图。

tubaba 发表于 2017-6-27 11:27:06

回复 29# joint


    哦,那是笔误,把Local $sStr = '"' & StringReplace($aArray[$i][$j], '"', '""') & '"'

改成Local $sStr = '"' & StringReplace($aArray[$i], '"', '""') & '"'

因为是一维数组

早发图不就什么都明白了{:face (207):}
页: 1 [2] 3 4
查看完整版本: 如何输出CSV格式数据并能被其它软件读取? 已解决。