找回密码
 加入
搜索
查看: 11015|回复: 48

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

 火.. [复制链接]
发表于 2017-6-20 13:51:56 | 显示全部楼层 |阅读模式
本帖最后由 joint 于 2017-6-28 14:15 编辑

新手请教:要是想让输出的数据为CSV格式,并直接传递给其它软件,应该怎么处理?
比如这样的输出:_ArrayDisplay($aText, '', '', '','名称1,'名称2,'名称3,')
要增加CSV格式的换行符也就是回车键,应该怎么加?
要直接把数据传递给其它软件应该怎么写?比如能让pandas.DataFrame直接读取。 谢谢。
发表于 2017-6-20 16:27:05 | 显示全部楼层
Func _SaveToCsv($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   ;==>_SaveToCsv
 楼主| 发表于 2017-6-20 16:59:15 | 显示全部楼层
本帖最后由 joint 于 2017-6-20 17:03 编辑

非常感谢,只是我水平比较差,看的不是很明白。如果对实时性有一定要求,可不可以不存为文件再读取,有没有可能直接在内存里像下面这样操作,只要能转换成逗号分割+换行回车符的话,理论上就应该可以直接读取了吧?不知道有没有函数可以直接做这种处理,我在下面第一行的结尾处要是加 "@CRLF" 的话会报错。
s=_ArrayDisplay($aText, '', '', '','名称1,'名称2,'名称3,')
df=pd.DataFrame(s) (说明:这里是由python程序读取)
 楼主| 发表于 2017-6-21 10:25:45 | 显示全部楼层
其实需求很简单,就是将AU3代码取得的数据以CSV格式存入变量S,然后由其它可以直接读取CSV格式的python程序直接读取。以保证有比较高的效率和实时性。
 楼主| 发表于 2017-6-24 11:03:52 | 显示全部楼层
把_ArrayDisplay显示的数组转存为CSV,下面的代码不报错,数组文件也显示正常,但是也没保存CSV文件,好像没干活。请教是怎么回事?

For $i = 0 To UBound($aText)-1
        $aText = StringReplace($aText,"[","")
        $aText = StringReplace($aText,"]","")
        $aText = StringReplace($aText,"|",",")
        $aText = StringReplace($aText,"%","")
        $replaceNum = @extended;
       
Next
FileWrite("d:\tools\yd.csv", _ArrayToString($aText, @CRLF))
MsgBox(0,"存为CSV文件",$replaceNum)
发表于 2017-6-24 11:08:20 | 显示全部楼层
回复 5# joint


    你又沒存成CSV 怎麼可能會 可以呢??

兩種系統 要交換  不可能不透過中間 檔案......所以 還是得弄成CSV
 楼主| 发表于 2017-6-24 11:54:12 | 显示全部楼层
本帖最后由 joint 于 2017-6-24 11:56 编辑
回复  joint


    你又沒存成CSV 怎麼可能會 可以呢??

兩種系統 要交換  不可能不透過中間 檔案... ...
kk_lee69 发表于 2017-6-24 11:08



    确实是不懂,是按word或python的思路,想以“另存为”的方式改变类型。主要是先替换了下一些特殊字符,还没搞清楚这里应该怎么搞。
发表于 2017-6-25 13:24:57 | 显示全部楼层
回复 7# joint

上面就有人提供存成 CSV 檔案的方法
 楼主| 发表于 2017-6-25 18:41:57 | 显示全部楼层
回复 8# kk_lee69

是啊,但是不好意思,我刚接触au3,还没搞明白怎么用上面的代码,比如怎么把下面这个数组保存为csv文件:
_ArrayDisplay($aText, '', '', '', '', 'A|B|C|D|E')
发表于 2017-6-25 19:39:58 | 显示全部楼层
本帖最后由 kk_lee69 于 2017-6-25 19:42 编辑

回复 9# joint


    上面
Func _SaveToCsv($aArray, $sCsvSavePath)

$aArray  就是你的陣列(數組)

$sCsvSavePath 就是存檔的路徑跟檔名

另外請上你的寫的與測試的 代碼
 楼主| 发表于 2017-6-25 22:04:02 | 显示全部楼层
回复  joint
    上面
Func _SaveToCsv($aArray, $sCsvSavePath)
$aArray  就是你的陣列(數組)
...
kk_lee69 发表于 2017-6-25 19:39



比如像下面这样文件就没有存啊,问题在哪里?

#include <Array.au3>

Local $array[1000][8]
For $i = 0 To 100
        For $j = 0 To 7
                $array[$i][$j] = "Item " & StringFormat("%02i", $i) & StringFormat("%02i", $j)
        Next
Next

$aArray = _ArrayDisplay($array, "", Default, 2+8, Default, "AA|BB|CC|DD|EE|FF|GG|HH|II|JJ", Default, 0xDDFFDD)


$sCsvSavePath=("d:\tools\yd.csv")

Func _SaveToCsv($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   ;==>_SaveToCsv
发表于 2017-6-26 01:12:56 | 显示全部楼层
回复 11# joint

你從頭到尾 沒有引用函數 怎麼會存檔................

_ArrayDisplay 只是秀資料 沒其他用途 別想用它來做任何事情....

看看我的語法 再比對一下自己的語法

#include <Array.au3>

Local $array[1000][8]
For $i = 0 To 100
        For $j = 0 To 7
                $array[$i][$j] = "Item " & StringFormat("%02i", $i) & StringFormat("%02i", $j)
        Next
Next

_ArrayDisplay($array)


_SaveToCsv ($array,@ScriptDir&"yd.csv")

MsgBox(0,"存檔成功","檔案位於:"&@ScriptDir&"yd.csv")

Func _SaveToCsv($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   ;==>_SaveToCsv
 楼主| 发表于 2017-6-26 08:28:28 | 显示全部楼层
本帖最后由 joint 于 2017-6-26 08:58 编辑
回复  joint
你從頭到尾 沒有引用函數 怎麼會存檔................
_ArrayDisplay 只是秀資料 沒其他 ...
kk_lee69 发表于 2017-6-26 01:12


谢谢。
因为也是刚学了一点点的python,由于在python中像这种已经打开的数据要保存为csv格式的话只要df.to_csv(filename)就可以了,所以思维上一下有点转不过弯来。加上缺乏经验,所以遇到的问题就比较多,比如你上面的代码,执行后,刚开始找不到存储的文件,后来发现,@ScriptDir &"yd.csv"其实不是存在程序当前目录,而是在上一级。
另外,我贴的代码前面的数据部分只是模拟,因为实际数据是另外的程序提供的,这个就需要把原来的_ArrayDisplay($aText)数据传递给转换函数中的变量:$array=_ArrayDisplay($aText),但是原数据中没有[$j]这个变量,在对接的时候,下面转换代码部分的变量[$j]就会报错,要是在Func _SaveToCsv($aArray, $sCsvSavePath)上面添加[$j]=0的话,存储的就是空文件,但要是把转换函数中的$aArray用原函数的$aText代替的话,本来只有几K的yd.csv已经增长到了几百兆还停不下来,也终止不掉,只好强制重启电脑了。
请教两个问题:
1、_ArrayDisplay函数如果只是产生视图的话,有没有其它函数可以把_ArrayDisplay函数显示的数据转成完整独立的可以被后面的转换函数直接调用的数据文件?
2、后面转换函数中的[$j]能否不与前面的数据产生程序的循环变量发生关系,而只针对前面已经生成的数据结果进行转换?就是说转换程序的[$j]是独立的存在,不依赖于前面的数据产生过程。
发表于 2017-6-26 09:37:13 | 显示全部楼层
回复 13# joint


因为实际数据是另外的程序提供的,这个就需要把原来的_ArrayDisplay($aText)数据传递给转换函数中的变量:$array=_ArrayDisplay($aText)

這句話 很怪  甚麼叫做  要傳遞 另外程式來的資料  跟 _ArrayDisplay 甚麼關係  ,你所有的邏輯都跟_ArrayDisplay  有關  ,但是 在我看來 根本不需要 _ArrayDisplay

DIM $Array[2][2]  設定2*2 陣列


$ARRAY[0][0]= 另外程式來的變量一
$ARRAY[0][1]= 另外程式來的變量二

第二筆資料為
$ARRAY[1][0]= 另外程式來的變量一
$ARRAY[1][1]= 另外程式來的變量一

這樣就賦值....... 跟 _ArrayDisplay 有何關係??

.........但是原数据中没有[$j]这个变量...... 我聽不懂你說甚麼了

可否麻煩 用個簡單例子  上傳你的程式碼   請包涵 python 那一段 你懂得 的方式 跟程式碼

不好意思 我不懂 python   所以我搞不懂你要做的事情
但是  你把 程式碼 都秀出來  我相信有人會看得懂的
 楼主| 发表于 2017-6-26 09:50:56 | 显示全部楼层
本帖最后由 joint 于 2017-6-26 09:58 编辑
回复  joint
因为实际数据是另外的程序提供的,这个就需要把原来的_ArrayDisplay($aText)数据传递给转 ...
kk_lee69 发表于 2017-6-26 09:37


我这样说看看能否说的清楚:
假设前面这段代码中$i、$j在每个时间段都是不固定的,就当作两个都是随机变量吧。
For $i = 0 To 10
        For $j = 0 To 7
                $array[$i][$j] = "Item " & StringFormat("%02i", $i) & StringFormat("%02i", $j)
        Next
Next
_ArrayDisplay($array)
现在要定时取样ArrayDisplay($array)所显示的数据,并存为csv1、csv2、csv3、。。。。
事先根本就不知道数据中$i、$j是多少,那应该怎么处理?
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-4-24 14:04 , Processed in 0.091101 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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