Страницы: 1
RSS
PQ: определение кол-ва столбцов при загрузке из csv
 
Добрый день.
Есть выгрузка из 1С, где в 1й строке 43 значения, а во 2й строке 10 000+ значений. Автоматом PQ определяет 43 столбца:
=Csv.Document(File.Contents("ххх.csv"),[Delimiter=";", Columns=43, Encoding=65001, QuoteStyle=QuoteStyle.None])
Если удалить параметр Column=43, то все равно определяются только 43 столбца. Загрузить все данные удается только если вручную задать параметр Column = 10 000. Возможно ли как-нибудь сделать, чтобы PQ смотрел во 2ю строку данных при загрузке из csv и определял кол-во столбцов сам?
 
Логика такая будет:
Код
let
    file = Binary.Buffer(File.Contents("ххх.csv")),
    SecondLine = Lines.FromBinary(file){1},
    ColumnsNo = List.Count(Table.ColumnNames(Csv.Document(SecondLine,[Delimiter=";", Encoding=1251, QuoteStyle=QuoteStyle.None]))),
    Source = Csv.Document(file,[Delimiter=";", Columns = ColumnsNo, Encoding=1251, QuoteStyle=QuoteStyle.None])
in
    Source

но вообще преобразовывать в таблицу с 10000+ столбцов - так себе идея. Там вообще другие строки есть?
Если файлы очень большие (сотни Мб), то BinaryBuffer может сыграть злую шутку
F1 творит чудеса
 
еще вариант - предварительно запустить Csv.Document с ожидаемым кол-вом колонок = 1 и параметром ExtraValues.List
Код
= Csv.Document(File.Contents("xxx.csv"), 1, ";", ExtraValues.List, 1251)

Тогда PQ уложит все "лишнее" в колонку с List. И можно посчитать макс значение элементов всех этих списков (не только 2-й строки, но можно только ее, конечно же). Но это так, теоретически - как там с производительностью будет я сказать не берусь  :)
Ну и уж совсем смеха ради  :D
Код
let
    Source = Csv.Document(File.Contents("xxx.csv"), 1, ";", ExtraValues.List, 1251),
    lst = List.Buffer(Source[Column1]),
    max_count = List.Max(List.Transform(lst, List.Count)),
    add_columns = List.Transform(lst, (x) => x & List.Repeat({null}, max_count - List.Count(x))),
    tbl = Table.FromRows(add_columns)
in
    tbl
Изменено: Alien Sphinx - 11.05.2023 17:10:27 (смех и радость мы приносим людям, а также ";")
Пришелец-прораб.
 
Максим, Alien Sphinx, спасибо вам большое. В моем случае работает отлично.
Максим, файл не большой, других строк нет, такая выгрузка. Учту ваше предупреждение.
 
Цитата
futurama3000 написал:
других строк нет
а, так вам только 2-я строка и нужна? Сразу бы и говорили. Вот она в виде List.
Код
Source = Csv.Document(File.Contents("xxx.csv"), 1, ";", ExtraValues.List, 1251){1}

Или у Максим Зеленский SecondLine - оно самое и должно быть.
Пришелец-прораб.
 
Alien Sphinx, спасибо.
Ваше решение универсальное) нужны обе строке
Изменено: futurama3000 - 12.05.2023 10:16:00
Страницы: 1
Наверх