Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование, связанное с MS Office > Вытащить данные из нескольких файлов Excel


Автор: mmvds 7.11.2010, 17:08
Здравствуйте, подскажите пожалуйста, как решить такую проблему:
есть много файлов вида f_dd.mm.yyyy.csv (текстовый с разделителем ";") в них содержатся данные за дату dd.mm.yyyy по двум товарам A и B
например:
A;300
B;800
Как объединить все эти данные в одну таблицу, например с такой шапкой:
ДАТА А B
С экселем дружу не сильно, в голову приходит только макрос на открытие файла, копирование, вставка но опять же это придется записывать вручную для каждого файла его имя. 

Добавил пример данных за несколько дней

Автор: Naghual 7.11.2010, 18:03
Проще будет обработать все файлы в папке в цикле и не заморачиваться с именами.

Автор: Akina 7.11.2010, 20:24
В цикле выполнить конкатенацию в один файл, затем импортировать в Эксель.

Автор: mmvds 7.11.2010, 21:25
Проблема решилась, помогли на другом форуме, немного не по Экселевски, но мне главное решить задачу smile


1) По месяцам:
Код

copy /b f*01.2010.csv 01.csv
copy /b f*02.2010.csv 02.csv
copy /b f*03.2010.csv 03.csv
copy /b f*04.2010.csv 04.csv
copy /b f*05.2010.csv 05.csv
copy /b f*06.2010.csv 06.csv
copy /b f*07.2010.csv 07.csv
copy /b f*08.2010.csv 08.csv
copy /b f*09.2010.csv 09.csv
copy /b f*10.2010.csv 10.csv
copy /b f*11.2010.csv 11.csv

Теперь за год:
Код

copy /b f*.csv all.csv


2) потом новый столбец D,E в D1="A" в E1="B" формулой =ЕСЛИ($D$1=A1;B1;"") растягиваем вниз по D, =ЕСЛИ($E$1=A1;B1;"") вниз по E
Получили столбец D где данные по А, где данные по Б - пусто, для соседнего столбца E - наоборот

3)Избавляемся от лишних пробелов:
Присваиваем Столбцу D  Имя ЕстьПустые1, столбцу E Есть Пустые2
Столбцу F НетПустых1, столбцу G НетПустых2
встаем в F1
Код

=ЕСЛИ(СТРОКА()-СТРОКА(НетПустых1)+1>ЧСТРОК(ЕстьПустые1)-СЧИТАТЬПУСТОТЫ(ЕстьПустые1);"";ДВССЫЛ(АДРЕС(НАИМЕНЬШИЙ((ЕСЛИ(ЕстьПустые1<>"";СТРОКА(ЕстьПустые1);СТРОКА()+ЧСТРОК(ЕстьПустые1)));СТРОКА()-СТРОКА(НетПустых1)+1);СТОЛБЕЦ(ЕстьПустые1);4)))

Аналогично для G1
растягиваем до половины таблицы
добавляем даты в столбец с датой 01.01.2010, 02.01.2010, растягиваем вниз пока есть значения, убеждаемся, что последняя дата- сегодняшнее число, все готово smile

Автор: Akina 7.11.2010, 22:00
Шаг 1 искренне порадовал... странно, что тебя по строке на файл не заставили написАть... и ещё: если у тебя NTFS - результат скорее всего будет верным, но если ФАТ32 - тебя ждут сюрпризы.

Автор: mmvds 7.11.2010, 22:14
По первому шагу именно так, т.к. если сделать тупо copy /b f*.csv all.csv то из-за особенностей сортировки сначала копирует все 01-ые числа, всех месяцев, потом 02, потом 03 и т.д. что не верно. Поэтому и пришлось сделать промежуточные файлы для каждого месяца, все верно
Немного неправильно написал общее объединение, верно вот так: 
Код

copy /b ??.csv all.csv

Автор: Akina 8.11.2010, 00:18
Код

echo.>all.csv
for %%a in (01,02,03,04,05,06,07,08,09,10,11,12) do (copy all.csv+f_??.%%a.2010.csv)

Собсно я об этом и говорил, упоминая конкатенацию.

Добавлено через 3 минуты и 8 секунд
И опять-таки - это корректно только на НТФС (ну и на exFAT).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)