找回密码
 加入
搜索
楼主: joint

[AU3基础] 如何输出CSV格式数据并能被其它软件读取? 已解决。

 火.. [复制链接]
发表于 2017-6-26 09:55:00 | 显示全部楼层
回复 15# joint


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

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

是 PYTHON 傳遞過來的嗎??
 楼主| 发表于 2017-6-26 10:06:11 | 显示全部楼层
回复  joint


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

$i、$j  是誰的 ...
kk_lee69 发表于 2017-6-26 09:55


这里就当作是独立第三方的吧,可能python,也可能AU3。
发表于 2017-6-26 10:09:50 | 显示全部楼层
回复 17# joint


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

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

我無法 解決了............
 楼主| 发表于 2017-6-26 10:23:02 | 显示全部楼层
回复 18# kk_lee69


实际需求就是这样的情况,数据来源会不同,可以被_ArrayDisplay($array)同样的显示,但数据的行、列、值都是动态变化的呀。
发表于 2017-6-27 09:47:55 | 显示全部楼层
回复 19# joint


这里的$i,$j,都是UBound函数得到的结果,所以你无需理会这个值究竟是多少.ArrayDisplay是一个用来显示数组的函数,它本身不是一个数组的表达方式.你只要调用_SaveToCsv($aArray, $sCsvSavePath),自然会把$aArray数组以文件的形式存储在sCsvSavePath路径中,明白了吗?
发表于 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
 楼主| 发表于 2017-6-27 10:12:57 | 显示全部楼层
本帖最后由 joint 于 2017-6-27 10:26 编辑
回复  joint
这里的$i,$j,都是UBound函数得到的结果,所以你无需理会这个值究竟是多少.ArrayDisplay是 ...
tubaba 发表于 2017-6-27 09:47


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


    好吧,我就问你一句,你这个$iItemCount是怎么得到的?这个相当于数组第一维,但你第二维没有定义啊,
既然有$iItemCount,那怎么没有$iColumnCount来定义第二维呢?
 楼主| 发表于 2017-6-27 10:27:15 | 显示全部楼层
本帖最后由 joint 于 2017-6-27 10:34 编辑
回复  joint


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


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

如果原数据是通过
For $i =
        For $j =
                $array[$i][$j]
方式得到的就没有问题。
发表于 2017-6-27 10:34:27 | 显示全部楼层
本帖最后由 tubaba 于 2017-6-27 10:37 编辑

再不明白,我建议好好学习数组方面的基本知识

#include <Array.au3>
For $i = 0 To $iItemCount - 1
        $aText[$i][0] = ControlListView('', '', 1703, 'GetText', $i, 0) 
        $aText[$i][1] = ControlListView('', '', 1703, 'GetText', $i, 1) 
        $aText[$i][2] = ControlListView('', '', 1703, 'GetText', $i, 2)
        $aText[$i][3] = ControlListView('', '', 1703, 'GetText', $i, 3)
        $aText[$i][4] = 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

 楼主| 发表于 2017-6-27 10:36:04 | 显示全部楼层
回复 25# tubaba

知道了,谢谢。
发表于 2017-6-27 10:44:14 | 显示全部楼层
自定义函数内部的变量不用你操心,你要关心的是正确的传入参数就可以了!我不明白你要管那个$i,$j干什么.把你的数组直接代入_SaveToCsv1($aArray, $sCsvSavePath),把参数正确传递不就行了
 楼主| 发表于 2017-6-27 11:08:47 | 显示全部楼层
再不明白,我建议好好学习数组方面的基本知识
tubaba 发表于 2017-6-27 10:34


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

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2017-6-27 11:15:52 | 显示全部楼层
自定义函数内部的变量不用你操心,你要关心的是正确的传入参数就可以了!我不明白你要管那个$i,$j干什么.把你 ...
tubaba 发表于 2017-6-27 10:44


是啊,应该是两件具体过程之间毫无关系,只是结果传递后的转换问题,所以很奇怪编译时为什么总是报错。具体情况见上图。
发表于 2017-6-27 11:27:06 | 显示全部楼层
回复 29# joint


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

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

因为是一维数组

早发图不就什么都明白了
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-17 00:30 , Processed in 0.073937 second(s), 14 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表