Страницы: 1 2 3 След.
RSS
Формирование таблицы с *.txt в *.excel, как правильно выставить разделитель?
 
Добрый вечер!  
Такая проблемка.  
 
Есть файл с данными в формате *.txt, его небходимо конвертировать в *.excel с кодировкой ANSI, но при открытии текстового файла через Эксель и выборе разделителя (в данном случае только пробел разделяет столбцы)столбцы разделяются не так как надо, во-первых, появляются один-два пустых столбца (наверное из-за двух пробелов сразу) и последний столбец (содержит в себе 4-5 слов) делится на 5 отдельных.  
 
Запутал я вас немного, теперь грубо говоря суть проблемы  
 
Есть вышеупомянутые текстовый файл, он содержит в себе данные в таком порядке  
 
Тип Дата Время Длительность Число1 Число3 Число2 Номер Адрес  
 
есть конвертер, но он не очень удобен так как работает с одним файлом и каждый раз этот файл надо открывать через него, и при конвертировании создается еще один файл в формате *.csv. На выходе конвертер делает данные в таком виде:  
 
Тип; Дата; Время; Длительность; Число1; Число3; Число2; Номер Адрес  
 
то есть ставит в качестве разделителя ";" (как я понял), в  таком случае все нормально разделяется. Но вот как это сделать самому я никак не пойму :(    
 
Текстовые файлы бывают разной длины (до нескольких десятков тысяч), прикрепляю несколько строк исходника (example.txt) и как должно получится и как получается (example.xls)
 
*.xls как должно быть, к посту 1
 
Есть готовое решение - попробуйте приспособить его под свои нужды:  
http://excelvba.ru/code/DATfolder2Array
 
Да, Эксель по пробелам неправильно разбивает - сдвоенные считает за один. Хотя так вероятно задумано.  
Но x = Split([a1]) отрабатывает правильно. На этом операторе можно код написать. Вечером возможно сделаю, если кто не опередит...
 
... опять я неподходящее решение предложил)  
 
Где-то здесь на форуме я выкладывал решение для задачи, ОЧЕНЬ похожей на вашу, - но найти его будет проблематично, проще сделать "с нуля"  
 
> есть конвертер, но он не очень удобен так как работает с одним файлом  
А вам надо обрабатывать одновременно много таких файлов TXT?  
Где макрос при запуске должен искать текстовые файлы? В какой папке?  
 
Что делать, если в текстовом файле (или файлах) наберется строк больше, чем строк на листе Excel?  
Куда девать излишки данных?
 
Есть вариант писать не в csv с ";", а в текст с разделителями TAB с расширением xls - такой файл откроется Экселем с виду как родной...  
Всё зависит от того, что дальше делать будете - я так себе обычно с TAB делаю.  
 
А про излишки точно нужно подумать...  
А может Эксель тут вообще для итоговой задачи не нужен, можно сразу всё скриптом и сделать :) - но это уже не по профилю :)
 
{quote}{login=EducatedFool}{date=13.01.2011 06:07}{thema=}{post}  
Где-то здесь на форуме я выкладывал решение для задачи, ОЧЕНЬ похожей на вашу, - но найти его будет проблематично, проще сделать "с нуля"  
{/post}{/quote}  
я вот попытался поискать на форуме, но так и не нашел, поэтому создал тему  
{quote}{login=EducatedFool}{date=13.01.2011 06:07}{thema=}{post}  
А вам надо обрабатывать одновременно много таких файлов TXT?  
Где макрос при запуске должен искать текстовые файлы? В какой папке?  
{/post}{/quote}  
Файлы для конвертации я планирую кидать в выделенную папку и сохранять в другую выделенную папку с исходным именем  
{quote}{login=EducatedFool}{date=13.01.2011 06:07}{thema=}{post}  
Что делать, если в текстовом файле (или файлах) наберется строк больше, чем строк на листе Excel?  
Куда девать излишки данных?{/post}{/quote}  
{quote}{login=Hugo}{date=13.01.2011 06:13}{thema=}{post}  
А про излишки точно нужно подумать...post}{/quote}  
Файлы объединять не надо. А в Excel 2010 1млн строк, этого более чем достаточно  
{quote}{login=Hugo}{date=13.01.2011 06:13}{thema=}{post} А может Эксель тут вообще для итоговой задачи не нужен, можно сразу всё скриптом и сделать :) - но это уже не по профилю :){/post}{/quote}  
Нет, Эксель, нормально подходит, дальше эти файлы льются в базу.
 
блин намутилось чего-то с цитатами :( как редактировать сообщение или нет такой возможности?
 
То же, но в более читабельном виде  
 
>Где-то здесь на форуме я выкладывал решение для задачи, ОЧЕНЬ похожей на вашу, - но найти его будет проблематично, проще сделать "с нуля"  
 
я вот попытался поискать на форуме, но так и не нашел, поэтому создал тему  
 
>А вам надо обрабатывать одновременно много таких файлов TXT?  
Где макрос при запуске должен искать текстовые файлы? В какой папке?  
 
Файлы для конвертации я планирую кидать в выделенную папку и сохранять в другую выделенную папку с исходным именем  
 
>Что делать, если в текстовом файле (или файлах) наберется строк больше, чем строк на листе Excel?  
Куда девать излишки данных?  
 
>А про излишки точно нужно подумать...  
 
Файлы объединять не надо. А в Excel 2010 1млн строк, этого более чем достаточно  
 
>А может Эксель тут вообще для итоговой задачи не нужен, можно сразу всё скриптом и сделать :) - но это уже не по профилю   
 
Нет, Эксель, нормально подходит, дальше эти файлы льются в базу.
 
{quote}{login=Hugo}{date=13.01.2011 06:06}{thema=}{post}Да, Эксель по пробелам неправильно разбивает - сдвоенные считает за один. Хотя так вероятно задумано.  
Но x = Split([a1]) отрабатывает правильно. На этом операторе можно код написать. Вечером возможно сделаю, если кто не опередит...{/post}{/quote}
Был бы Вам очень признателен
 
Так вот на днях тема была на 99% подходящая:  
 
http://www.planetaexcel.ru/forum.php?thread_id=23161&thread_id=23161&page_forum=lastpage&allnum_forum=11#post189838  
 
Код тут: http://www.planetaexcel.ru/docs/forum_upload/post_189837.xls  
 
Если сам Казанский не скорректирует, могу подправить.  
Я бы делал другим способом, но алгоритм не менял - я его там в начале описал :)  
Там всего-то надо для Вас изменить: не пропускать первую строку, не писать первую искусственную строку, да переставить порядок частей массива и слить последние части массива в вместе.
 
Вот, получился такой гибрид ежа с ужом на основе кода Казанского - что-то я с  Line Input #1 не дружу :)  
Но есть косячок, поэтому не могу сказать, что готово - что-то в примере WAP нелогично расположен. Оно там всё правильно - перед этим словом два пробела, но его нужно в G положить?  
Если так, то нужно добавить ещё одну проверку и чуть подкрутить перебор массива.  
Но при открытии в Экселе форматы нужно выставлять руками - в csv нет формата полей.
 
Так например можно косяк с WAP исправить:  
 
           If UBound(v) > 0 Then  
           If v(9) = "WAP" Then v(8) = "WAP"  
               For i = 10 To UBound(v): temp = temp & " " & v(i): Next  
               Print #1, Join(Array(v(2), v(3), v(4), v(5), v(6), v(7), v(8)), ";") & ";" & Trim(temp)  
               temp = ""  
           End If
 
Спасибо, завтра поколдую.  
 
Да WAP в G, но там могут быть и другие значения, как цифровые так и словарные (но в основном цифры)
 
Hugo  
а нельзя конечный файл сделать *.xls, а не *csv?  
 
З.Ы. Спасибо большое очень помог
 
Можно и в *.xlsX (*.xls не годится из-за возможного количества строк), но давай сперва определимся по столбцу G - какие там могут быть варианты?  
Да и нет у меня сейчас тут 2007 Экселя (да и свободного времени тоже...) - так что код полностью сейчас проверить не смогу, поэтому и писать итоговый вариант сейчас не буду. Коллеги, подключайтесь.
 
{quote}{login=Hugo}{date=14.01.2011 09:26}{thema=}{post}Можно и в *.xlsX (*.xls не годится из-за возможного количества строк), но давай сперва определимся по столбцу G - какие там могут быть варианты? Коллеги, подключайтесь.{/post}{/quote}  
 
Я так понял, что в G не переносятся только слова? Вариантов G может быть много, другой вопрос, что например в файле в G из тысячи записей может быть 2-3 слова (не цифр), а может быть и 500 :) я так понял, что для таких случаев отдельно создается столбец H?  
 
По вариантам я сегодня посмотрю, к вечеру отвечу. Спасибо!
 
По G - посмотрите, там перед WAP два пробела, а перед WAPPING один. Т.е. к чему привязываться и куда что класть?  
Или так сделать - если восьмой элемент пустой, тупо заполняем его из девятого? Так вроде должно сработать - показывайте другие варианты таких строк.
 
С G разобрался, как выше написал - тупо If v(8) = "" Then v(8) = v(9) (заодно смотрим, чтоб массив был больше 9, а то будет ошибка):  
 
           If UBound(v) > 9 Then  
           If v(8) = "" Then v(8) = v(9)  
           For i = 10 To UBound(v): temp = temp & " " & v(i): Next  
           Print #1, Join(Array(v(2), v(3), v(4), v(5), v(6), v(7), v(8)), ";") & ";" & Trim(temp)  
           temp = ""  
           End If  
 
В Эксель пока не делал...
 
Hugo, возможно два пробела поставил я случайно. Когда я конвертирую исходные файлы (пока сделал 16 штук сразу) текст нормально ставится туда - куда надо, при этом столбец G оказывается пустым.
 
Тогда сперва разберитесь с этими пробелами - лучше дайте кусок оригинального файла. Можете в блокноте поубирать ЦЕЛИКОМ ненужные СТРОКИ, оставьте все возможные варианты.
 
{quote}{login=AMIHb}{date=14.01.2011 12:05}{thema=}{post}текст нормально ставится туда - куда надо, при этом столбец G оказывается пустым.{/post}{/quote}  
 
Прошу меня простить, пустым остается столбец H, а надпись типа WAP и прочие нормально вписываются в G, то есть сейчас меня все целиком устраивает, только H пустая. Спасибо большое за помощь
 
Т.е. это с последними коррекциями? И от 14.01.2011, 11:02 тоже?  
Но у меня на Вашем примере Н заполняется... значит там пробелы всёж иначе в оригинале.
 
{quote}{login=Hugo}{date=14.01.2011 12:34}{thema=}{post}Т.е. это с последними коррекциями? И от 14.01.2011, 11:02 тоже?  
Но у меня на Вашем примере Н заполняется... значит там пробелы всёж иначе в оригинале.{/post}{/quote}  
 
Нет, это тот файл, который Вы дали вчера  
Я так понял, если в строке  
Print #1, Join(Array(v(2), v(3), v(4), v(5), v(6), v(7), v(8), v(9)), ";") & ";" & Trim(temp)  
 
убрать v(9), то все получается как надо  
 
Пример от 14.01.2011 11:02 не посмотрел, не могу понять куда его засунуть, в конец кода с первого файла?
 
Ну да, в этом примере как раз v(9) уже и нет.  
А засунуть - замените похожий кусок кода, от    
If UBound(v) > 9 Then  
до  
temp = ""  
End If
 
все вставил. Работает. Спасибо
 
Стоп, если  
"то есть сейчас меня все целиком устраивает, только H пустая"  
значит, там всёж перед WAP не два пробела было. Тогда строка кода  
If v(8) = "" Then v(8) = v(9)  
лишняя, хотя и не мешает, только чуть тормозит...  
А в Эксель ещё нужно делать?
 
{quote}{login=Hugo}{date=14.01.2011 01:19}{thema=}{post}А в Эксель ещё нужно делать?{/post}{/quote}  
 
Спасибо Вы и так очень помогли, пока попытаюсь сам сделать, чтобы не отвлекать Вас напрасно. Если че не будет получаться, тогда спрошу. СПАСИБО ОГРОМНОЕ!
 
Чтоб в Эксель - там нужно немного иначе делать.  
Я планирую так:  
1. Читаем сразу весь текст в массив, разбивая по концам строк, вернее в данном случае по Chr(10).  
2. Создаём другой такой же массив, или вернее с таким же количеством строк и с нужным количеством столбцов.  
3. Прекладываем данные, разбивая каждую строку первого массива по уже опробованному алгоритму.  
4. Создаём новую книгу.  
5. Форматируем нужные столбцы листа - где будут длинные номера.  
5. Выгружаем полученный массив на лист (одним движением).  
6. Сохраняем файл *xlsx.  
Всё это в цикле с перебором файлов.
 
{quote}{login=Hugo}{date=14.01.2011 02:20}{thema=}{post}Чтоб в Эксель - там нужно немного иначе делать.  
Я планирую так:  
1. Читаем сразу весь текст в массив, разбивая по концам строк, вернее в данном случае по Chr(10).  
2. Создаём другой такой же массив, или вернее с таким же количеством строк и с нужным количеством столбцов.  
3. Прекладываем данные, разбивая каждую строку первого массива по уже опробованному алгоритму.  
4. Создаём новую книгу.  
5. Форматируем нужные столбцы листа - где будут длинные номера.  
5. Выгружаем полученный массив на лист (одним движением).  
6. Сохраняем файл *xlsx.  
Всё это в цикле с перебором файлов.{/post}{/quote}  
 
Лучше все же в *.xls, чем *xlsx, т.к. конечные файлы будут отдаваться пользователям, а у них скорее всего стоят максимум 2003-тьи офисные пакеты.  
И еще очень важно, чтобы сохранялись исходные имена файлов.    
 
Что я планирую дальше сделать:  
Файлы с папки Out открыть поочередно (или все сразу), создать шапку в каждом файле (т.е. название столбцов), выставить правильные форматы по столбцам и сохранить в *.xls в папке temp (там где находятся *txt файлы. В идеале после всего этого *.csv с папки Out удаляются.  
 
Я представляю себе как это сделать кустарно, единственное что не мог понять (да и сейчас не особо понял) как сделать правильное распознавание столбцов с текстового файла. Но Вы мне в этом очень помогли.
Страницы: 1 2 3 След.
Читают тему
Наверх