Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> import *.dat format in *.csv, перевод формата файла 
V
    Опции темы
Valeria
  Дата 24.9.2007, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 16.5.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



как имея обычный dat файл перевести его в cvs? в дат файле информация содержится как бы в виде таблицы, только все разделено пробелами, а нужно соответственно разделять к какой колонке какая информация принадлежит?! хотела регулярное выражение взять с пробелами, но там есть слова, разделенные пробелами в одной колонке. как быть?! cvs файл - это такой же, только поля разделены запятыми.
т.е. дан файл
Код

   333            пврпапа                   авпапвап                         апвапвапв
   334            укеукуепппп            ааауууууууйц                  ааааа ьььььььььь
   335            ыапап                       ввввввввввввввв                                                                аааааааааааа
   336ппп      ттттттттттт                                                      ссссссссс  ввввввввв                   уууууууууууууу  


 ???

Добавлено через 1 минуту и 43 секунды
немного неправильно отобразилось, реально одинаковые колонки начинаются с одинакового числа символов от начала строки. визуально их можно различить...
PM MAIL ICQ   Вверх
chief39
Дата 24.9.2007, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 15
Всего: 77



Да хотя бы так(примерно):
Код

StringTokenizer tok = new StringTokenizer("fdsfdf ,fdfsd fds,fsdfdfdsf,fsdfsd", ",");
         while(tok.hasMoreTokens()){
             String str = tok.nextToken();
         }


CVS и CSV - разные вещи. Тебе нжен именно CSV(comma separated values)
Токенайзер - самое простое и ручное.

Добавлено через 13 минут и 5 секунд
Погляди ещё

Это
Это
И просто кучу других smile

Это сообщение отредактировал(а) chief39 - 24.9.2007, 17:14


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
Valeria
Дата 25.9.2007, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 16.5.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



я же не могу весь файл расписать через StringTokenizer, чтобы запятые вставить, проще тогда от руки их прописать, нет?!

Добавлено через 1 минуту и 16 секунд
кстати, да csv! 
PM MAIL ICQ   Вверх
_Y_
Дата 25.9.2007, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 5
Всего: 34



Цитата(Valeria @ 24.9.2007,  16:45)
 информация содержится как бы в виде таблицы, только все разделено пробелами, ... но там есть слова, разделенные пробелами ... одинаковые колонки начинаются с одинакового числа символов от начала строки. визуально их можно различить...

Делить по пробелам это, что называется, некорректная задача. Комп он глупый и сам не знает (и никогда не узнает) что какой пробел  означает.
Правильно ли я понял, что каждая колонка занимает строго определенное количество символов? Тогда что-то вроде этого:

Код

//Задаем длину символов в колонке считая и пробелы, разделяющие колонки
int nSymbols = 10;
//Задаем число колонок
int nCols = 5;
//читаем строку
string = ......
//Заменяем  разделяющие колонки пробелы на запятые
for(int i = 1; i < nCols; i++) string = string.substring(0, nSymbols*i - 1) + "," +  string.substring(nSymbols*i);
//Убираем пробелы предшествующие и последующие за запятыми
int lns;
do {
    lns = string.length();
    string.replaceAll("\s,", ",");
    string.replaceAll(",\s", ",");
} while (lns > string.length());
//Строка готова к записи в новый файл


ЗЫ: Это примерно и не претендует на оптимальность.

ЗЫЫ: Понятное дело, что в этом случае текст, содержащийся в колонках, не должен включать запятых. Иначе опять получаем некорректную задачу, только теперь с запятыми, а не с пробелами smile 

Это сообщение отредактировал(а) _Y_ - 25.9.2007, 11:36


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Valeria
Дата 25.9.2007, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 16.5.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



да,  только там таких полей порядка 50 и колонки все разные по размеру!!!!  smile 
получается, это единственный вариант, который будет работать только для этого файла?! 
PM MAIL ICQ   Вверх
chief39
Дата 25.9.2007, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 15
Всего: 77



Цитата(_Y_ @  25.9.2007,  11:28 Найти цитируемый пост)
Делить по пробелам это, что называется, некорректная задача. Комп он глупый и сам не знает (и никогда не узнает) что какой пробел  означает.
Правильно ли я понял, что каждая колонка занимает строго определенное количество символов? 

Упустил насчёт того, что пробелами всё(CSV только в глаза попалось по диагонали...)

Valeria, тогда без вариантов - ты и сама-то сможешь различить только отступами. Тогда - задание жёстких отступов, как Y советует.

Цитата(Valeria @  25.9.2007,  09:12 Найти цитируемый пост)
я же не могу весь файл расписать через StringTokenizer, чтобы запятые вставить, проще тогда от руки их прописать, нет?!

Ты не поняла smile Я не глянул что у тебя пробелы - CSV предполагает запятые. Токенайзер не вставляет запятые - он разбирает строку на куски, которые были разделены запятой(или что укажешь ему)

Добавлено через 1 минуту и 23 секунды
Цитата(Valeria @  25.9.2007,  11:46 Найти цитируемый пост)
да,  только там таких полей порядка 50 и колонки все разные по размеру!!!!  smile 
получается, это единственный вариант, который будет работать только для этого файла?!  

Сделай массив(лучше коллекцию) с размерами полей. Можешь передавать параметрами этот набор размеров - прога станет конфигуримой. Изменится размер одного поля - изменяешь этот параметр - и погнали


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
_Y_
Дата 25.9.2007, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 5
Всего: 34



Цитата(Valeria @ 25.9.2007,  11:46)
да,  только там таких полей порядка 50 и колонки все разные по размеру!!!!

Ну я же самый простой вариант дал. smile  Колонки разные - тогда:
Цитата(chief39 @ 25.9.2007,  11:48)
Сделай массив(лучше коллекцию) с размерами полей. Можешь передавать параметрами...

Как вариант - чтобы не считать число знаков вручную - сделать GUI, который бы:
  • выводил  несколько первых строк файла моноширинным шрифтом
  • перед первой строкой загонял бы пустую строку
  • позволял бы в этой пустой строке расставить вручную стартовые позиции для колонок
  • по клавише "Пуск" читал бы эту первую строку, парсил и выяснял как бить колонки
Впрочем GUI-в разных много напридумывать можно для этих целей smile 



--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Valeria
Дата 25.9.2007, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 16.5.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



спасибо всем. написала программу smile
PM MAIL ICQ   Вверх
chief39
Дата 25.9.2007, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 15
Всего: 77



Работает намана? smile


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
Valeria
Дата 26.9.2007, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 16.5.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



работает нормально с массивом, но на файле, который я сама создала в качестве примера. а вот на том файле, что мне прислали не идет, т.к. он очень большой, там порядка 50 полей а реально я насчитала 28,  но и с ними не заработало.

и у меня так же есть файл, описывающий число полей и их размер, не знаю, как он мне может пригодится? 

вообщем, пишу американцу, что ничего не получилось...
PM MAIL ICQ   Вверх
_Y_
Дата 26.9.2007, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 5
Всего: 34



Valeria, почему не получилось? Задача ведь тивиальная. Может стОит показать публике реальные фаилы?


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Valeria
Дата 26.9.2007, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 16.5.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



ну реальный файл очень большой, примерно две строки выглядят так 264 и 265 


Код


        264          IPOERMBBBBAAA                                                 MPOEESKKKHHHH                                                                                                                       MPOEESKKKHHHH VERMAAAAAAA                                                                                                                                                                                                                    M0001-01-01V65 M2      0001-01-01BASCLTB01           0001-01-01                                                                                                                                                                                               000001011                                                                                                                                                                                                                                                                                            .00          .00          .00          .000001-01-010001-01-010001-01-010001-01-01     0     0     0     0          0          0          0          0CSC03212  2003-05-0304.20.15
        265          IAНЕO                                                         SHABNTH                                                                                                                             SHABNTH RAO                                                                                                                                                                                                                                  F0001-01-01R   S63     0001-01-01BASCLTB01           0001-01-01                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    .00          .00          .00          .000001-01-010001-01-010001-01-010001-01-01     0     0     0     0          0          0          0          0MRS03478  2003-06-1301.51.51


в описании там написано 

                 06 SEQNUM             PIC S9(10).                               
                                   
                 06 HISTSEQNUM            PIC S9(10).                               
                                   
                 06 NAME               PIC X(60).                                
                                           
                 06 PHONE1                PIC X(32).      


и так далее....
как это использовать, не знаю?! просто число полей и сколько они должны в памяти места занимать.
я когда массив чисел писала, просто посчитала число колонок в файле и позицию каждой колонки.
я думаю вряд ли тут что можно придумать еще... smile

Добавлено через 2 минуты и 34 секунды
это кстати описание в Кобол, вообще есть и java типа  "GRN" CHAR(10) NOT NULL WITH DEFAULT '' , 
PM MAIL ICQ   Вверх
COVD
Дата 26.9.2007, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



dat файлы не имеют стандартного формата. Каждое приложение, создающее dat, использует свой формат и только оно и может нормально его читать. Вам надо прочитать файл побайтно и понять его структуру, какие байты используются для разделения колонок (возможно не только пробелы), какие для переноса строки. Потом уже решать как конвертировать.
PM MAIL   Вверх
_Y_
Дата 26.9.2007, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 5
Всего: 34



А у меня возникла вот такая идея, основанная на предположении, что у Вас колонки фиксированной ширины (число символов в колонке) и разделены пробелами.  

Идея: Пробелы, разделяющие колоноки находятся в каждой строке в одних и тех же положениях. Надо пройти весь файл два раза:
  • Читая его первый раз определить положения, в которых пробелы имеются во всех строках
  • Просмотреть полученный список "разделяющих позиций". Если две или больше позиции идут подряд, очевидно, что никакой колонки между ними нет. Такие случаи надо считать одним разделителе.
  • Читая файл во второй раз, заменять пробелы на месте разделителей запятыми.



--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Valeria
Дата 26.9.2007, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 16.5.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



_Y_,ну с пробелами хуже, т.к. одно поле может содержать несколько слов?! т.е. эти пробелы надо пропускать, но их нельзя определить. поэтому проще было искать положение колонок по словам, но к сожалению они не все заполнены.

Добавлено через 2 минуты и 53 секунды
кстати, некоторые колонки не содержат пробелов, а идут подряд ....
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1090 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.