Читать csv-поток построчно, чтобы создать массив для Excel Range - PullRequest
0 голосов
/ 18 сентября 2018

Это мой первый пост - я буду рад внести любые исправления, необходимые для любых ошибок, допущенных в посте.

Я просматривал форумы здесь несколько месяцев и многому научился, но, похоже, не могу достичь своей цели тем, что нашел.

Мне нужно прочитать файл CSV (только для чтения), когда он изменяется, и поместить полученный массив в активный и открыть вкладку Excel 2016. Я могу сделать это, используя com и system.io.watcherchangetypes, но это слишком медленно и требует копирования вставки.

Мне нужно как можно быстрее прочитать csv (менее секунды) и преобразовать строки в пригодный для использования массив для Excel. Весь этот процесс должен занять не более 2 секунд МАКС. В течение дня некоторые из CSV будут превышать 180000 строк.

Я работаю в торговой компании.

Я был бы счастлив с одним столбцом, разделенным табуляцией и несколькими строками. Я не могу получить несколько строк.

Я должен записывать диапазон построчно, и это занимает слишком много времени.

Я смотрел на это, но мне не ясно, как сделать все это динамичным. Количество заголовков не задано, и строки также изменятся. Я вообще не могу работать со статическими данными.

Это сообщение побудило меня обратиться за помощью: Как использовать powershell для изменения порядка столбцов CSV

$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()

Любая помощь будет принята с благодарностью!

UPDATE:

Я понял это. Результат, вероятно, не самый эффективный, но он дает мне то, что мне нужно на данный момент, в то время как я изучаю, как лучше выполнить его с тем, что я узнал.

(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 голосов
/ 12 мая 2019

Вы можете сделать что-то вроде этого

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

sep = '\ s +' может быть полезен для декодирования вкладок в несколько строк И тогда flatten () может сделать это в одной строке или массиве

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...