逐行读取csv流以为Excel Range创建数组

时间:2018-09-17 23:01:54

标签: excel powershell csv streamreader

这是我的第一篇文章-我很乐意对文章中的任何错误进行必要的更正。

我已经在这里的论坛上浏览了几个月,学到了很多东西,但是我似乎无法用发现的东西实现我的目标。

我需要在更改时读取CSV文件(只读),并将结果数组放入并激活并打开Excel 2016 Tab。我可以使用com和system.io.watcherchangetypes进行此操作,但这太慢了,需要复制粘贴。

我需要尽快读取csv(在一秒钟之内),并将这些行转换为适用于Excel的数组。整个过程最多需要2秒。随着一天的流逝,某些CSV将超过180,000行。

我在一家贸易公司工作。

我会对单列,制表符分隔和多行感到满意。我无法获得多行。

我必须逐行写范围,这花了太长时间。

我一直在看这个,但是我不清楚如何使整个过程变得动态。标题没有设置的数量,行也将更改。我根本无法使用任何静态数据。

这是促使我寻求帮助的帖子:How to use powershell to reorder CSV columns

$export = "\\UNC\to\file\Name.csv"
#$excel = New-Object -ComObject Excel.Application
#$excel.visible = $true
#$workbook = $excel.Workbooks.Add()

$reader = [System.IO.File]::OpenText($export)
$writer = New-Object System.IO.StreamWriter "data2.csv"
for(;;) {
    $line = $reader.ReadLine()
    if ($null -eq $line) {
        break
    }
    $i=1
    $data = $line.Split(",") | %{
    if($_ -ne $null)
    {
        Write-Host $_ $i
        ++$i
    }
    }
    [void]$data.Length
   # $data.GetValue()
    #$writer.WriteLine('{0},{1},{2}', $data[0], $data[1], $data[2])
}
$reader.Close()
#$writer.Close()

任何帮助将不胜感激!

更新:

我知道了。结果可能不是最有效的,但是当我探索如何用我所学到的知识更好地完成任务时,它可以满足我目前的需求。

(Measure-Command { $data = [System.io.File]::Open($export, 'Open', 'Read', 'ReadWrite')
$reader = New-Object System.IO.StreamReader($data)
$count = 0
While($text = $reader.Readline())
{
    If($text -eq $null)
    {
        $reader.Close()
        $data.close()
    }
    ++$count
}
}).TotalSeconds

$array2 = New-Object 'object[,]' $count,1
$end = ++$count
$file = New-Object System.IO.StreamReader -ArgumentList $export
$stringBuilder = New-Object System.Text.StringBuilder
$list = New-Object System.Collections.Generic.List[System.String]
$a = 0
Measure-Command {
    While ($i = $file.ReadLine() -Replace ",","`t")
    {
        if ($i -eq $null)
        {
            $file.close()
            break loop
        }
        $null = $stringBuilder.Append($i)
        $list.Add($i)
        $array2[$a,0] = $i
        ++$a
    }

    $outputString = $stringBuilder.ToString()
    $array = $list.ToArray()
}

1 个答案:

答案 0 :(得分:0)

您可以执行以下操作

data = pd.read_csv("data1.csv", sep='\s+',header=None)
dataarraynew13phse = np.array(data)
dataarraynew13phse=dataarraynew13phse.flatten()

sep ='\ s +'可用于多行解码制表符 然后,flatten()可以将其放在单个行或数组中