cashiba 发表于 2016-11-10 21:55:38

有没有把CSV文本转成二维数组的函数[已解决]

本帖最后由 cashiba 于 2016-11-12 19:51 编辑

有一些文本是从表格保存为CSV文本的,或者用空格分隔,或者用TAB分隔,其实就是二维数组文本化的
AU3里有_fileReadtoArray,是将文本按行转成一维数组,好像没看到转二维的....
先用fileReadtoArray得到行
再把每一行用stringsplit分割出列来
然后赋予二维数组
好像就这个思路了....
当然还有万能的正则

office里有个把文本转成表格的功能很好用,跟这个如出一辙.....如果AU3里有这样类似的通用性强的自定义函数就好了
这样的话,像http://www.autoitx.com/forum.php?mod=viewthread&tid=44383&highlight=%CE%C4%B1%BE%2B%CA%FD%D7%E9这样的问题就不是问题了吧
{:face (382):}

cashiba 发表于 2016-11-10 23:45:10

没让人失望...找到了:_FileReadToArray
读取文件内容到 1D 或 2D 数组.

#include <File.au3>
_FileReadToArray ( $sFilePath, ByRef $vReturn [, $iFlags = $FRTA_COUNT [, $sDelimiter = ""]] )

参 数
$sFilePath 路径和文件名.
$vReturn 保存返回数据的变量 - 不需要是一个数组.
$iFlags [可选] 根据需要添加多个值
    $FRTA_NOCOUNT (0) - 使用 UBound() 获取基于 0 的数组大小
    $FRTA_COUNT (1) - (默认值), 数组的第一个元素用于计数.
    $FRTA_INTARRAYS (2) - 创建 "array of arrays"(全数组的单数组) - 参见备注
    $FRTA_ENTIRESPLIT (4) - 使用整个分隔符作为字符串拆分点 (默认分隔符的每个字符定义拆分点)
$sDelimiter [可选]
为文件的每一行使用更多拆分 - 例如读取 CSV 文件到一个二维数组

返 回 值
成功: 返回 1, $vReturn 保存为数组.
失败: 返回 0, @error 设置 为非 0 值, 并且 $vReturn 设置为 0.
@Error: 1 - 打开指定文件错误
2 - 不能拆分文件
3 - 文件行有不同数量的字段 (仅当未设置 $FRTA_INTARRAYS 标志时)
4 - 没有发现分隔符 (仅当未设置 $FRTA_INTARRAYS 标志时)

cashiba 发表于 2016-11-11 17:55:14

唉,还以为直接得到二维数组呢,木想到最后得到的是:

h20040606 发表于 2016-11-12 15:03:30

可以直接到2纬数组啊
_FileReadToArray($tmpdir & "\采集点信息文件.txt", $SiteInfo, $FRTA_NOCOUNT, ",")

ddrs 发表于 2016-11-12 18:31:03

楼上说的简洁

cashiba 发表于 2016-11-12 19:24:56

$FRTA_INTARRAYS (2) - 创建 "array of arrays"(全数组的单数组) - 参见备注
帮助没看懂,没明白全数组的单数组.....是啥意思
{:face (396):}
备 注
如果不指定分隔符, 则函数返回一个 1 维数组, 并且每个元素保存文件的一行内容 - 行尾可以是 @CR, @LF 与 @CRLF 的任何组合.

当指定分隔符时函数将试图进一步拆分文件的每一行 - 如何做到这一点取决于 $FRTA_INTARRAYS 标志的设置.
如果该标志没有被设置, 并且每行有相同的字段数, 则使用分隔符拆分后创建一个 2 维数组. 如果不是这样, 则 @error 被设置为 3, 并且数组没有返回.
如果设置了 $FRTA_INTARRAYS 标志, 函数创建一个 1 维数组, 每个元素保留的字段可以用分隔符进一步拆分为数组 - 行不需要具有相同的字段数. 看下面的例子.

如果分隔符是多个单字符, 则 $FRTA_ENTIRESPLIT 标志的设置决定拆分方法.#include <Array.au3>
#include <File.au3>
#include <MsgBoxConstants.au3>

Example()

Func Example()
    Local $aRetArray, $sFilePath = @TempDir & "\Test.txt"

    ; 创建 1 维数组
    Local $aArray[] = ["0", "1", "2", "3", "4"]
    ; 写到文件
    _FileWriteFromArray($sFilePath, $aArray, Default, Default, @CRLF)
    Sleep(1000)

    ; 重读 - 并计数
    _FileReadToArray($sFilePath, $aRetArray)
    _ArrayDisplay($aRetArray, "1 维数组 - 计数", Default, 8)

    ; 重读 - 不计数
    _FileReadToArray($sFilePath, $aRetArray, $FRTA_NOCOUNT)
    _ArrayDisplay($aRetArray, "1 维数组 - 无计数", Default, 8)

    ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    ; 创建 "square" 2 维数组
    Local $aArray[][] = [ _
            ["00", "01", "02", "03"], _
            ["10", "11", "12", "13"], _
            ["20", "21", "22", "23"], _
            ["30", "31", "32", "33"]]
    _ArrayDisplay($aArray, "Original", Default, 8)
    ; 写到文件
    _FileWriteFromArray($sFilePath, $aArray, Default, Default, ",")
    Sleep(1000)

    ; 重读 - 并计数
    _FileReadToArray($sFilePath, $aRetArray, Default, ",")
    _ArrayDisplay($aRetArray, "2 维数组 - 计数", Default, 8)

    ; 重读 - 不计数
    _FileReadToArray($sFilePath, $aRetArray, $FRTA_NOCOUNT, ",")
    _ArrayDisplay($aRetArray, "2 维数组 - 无计数", Default, 8)

    ; 读入 "array of arrays" 并计数
    _FileReadToArray($sFilePath, $aRetArray, $FRTA_COUNT + $FRTA_INTARRAYS, ",")
    _ArrayDisplay($aRetArray, "arrays 数组 - 计数", Default, 8)
    ; 现在看 arrays 内部返回的数组
    _ArrayDisplay($aRetArray, "RetArray 内部数组 1 - 计数", Default, 8)

    ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    ; 改写 2 维数组与多个分隔符
    _FileWriteFromArray($sFilePath, $aArray, Default, Default, ":|")
    Sleep(1000)

    ; 重读, 每个分隔符作为一个拆分点
    _FileReadToArray($sFilePath, $aRetArray, $FRTA_NOCOUNT, ":|")
    _ArrayDisplay($aRetArray, "拆分每个字符", Default, 8)

    ; 重新读取,整个分隔符作为一个拆分点
    _FileReadToArray($sFilePath, $aRetArray, $FRTA_NOCOUNT + $FRTA_ENTIRESPLIT, ":|")
    _ArrayDisplay($aRetArray, "完整分隔符拆分", Default, 8)

    FileDelete($sFilePath)
EndFunc   ;==>Example#include <Array.au3>
#include <File.au3>
#include <MsgBoxConstants.au3>

Example()

Func Example()
    ; 定义一个传递给 _FileReadToArray() 的变量.
    Local $aArray = 0

    ; 使用先前定义的变量读取当前文件到数组.
    ; 指定 $iFlag 为 0, 不定义数组元素计数. 使用 UBound() 查找数组的大小.
    If Not _FileReadToArray(@ScriptFullPath, $aArray, 0) Then
      MsgBox($MB_SYSTEMMODAL, "", "读取该文件时出错. @error: " & @error) ; 读取当前文件时出错.
    EndIf

    ; 调用 _ArrayDisplay 函数显示该数组.
    _ArrayDisplay($aArray)
EndFunc   ;==>Example

cashiba 发表于 2016-11-12 19:30:32

可以直接到2纬数组啊
_FileReadToArray($tmpdir & "\采集点信息文件.txt", $SiteInfo, $FRTA_NOCOUNT, "," ...
h20040606 发表于 2016-11-12 15:03 http://www.autoitx.com/images/common/back.gif
感谢指点!不然有成熟的函数有不知道怎么用....
{:face (189):}
页: [1]
查看完整版本: 有没有把CSV文本转成二维数组的函数[已解决]