Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
258 / 107 / 26
Регистрация: 15.03.2012
Сообщений: 353
Записей в блоге: 33
1

Текстовый формат UNIX: Как быстро идентифицировать такой тип файлов

22.06.2012, 08:48. Показов 3332. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Посмотрите программу:
TEST0014.zip
и попробуйте загрузить в неё два файла:
ndv-txt-13-10.gb - загружается нормально,
это текстовый файл того типа которым обычно пользуемся,
ndv-txt-10.gb - загружается не корректно
это текстовый файл который загружается с GenBank
http://www.ncbi.nlm.nih.gov/
National Center for Biotechnology Information

Это не было бы проблемой если этот файл
можно загрузить в одну строку, но обычно эти файлы
бывают размером от 20Mb до 40Mb
(иногда и больше, но редко) и программа
в режиме файла последовательного доступа
открыть их не может.

Вопросы:
1. Как быстро идентифицировать такой тип файлов?
2. Как конвертировать в обычный текстовый файл?

Пока что решаем эту проблему так:
FAR (F4, Shift+F2, Save as DOS text)

Какие-нибудь идеи будут?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.06.2012, 08:48
Ответы с готовыми решениями:

Преобразовать текстовый файл в Unix формат
Всем здравствуйте! Необходимо преобразовать текстовый файл из Windows в unix формат. Вообще это...

Как перевести время в Unix формат
Как перевести строку вида: $var = '1m2w4d6h52m15s'; 1. в секунды? 2. в "1 месяц 2 недели 3 дня 6...

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

Тип VB Object. Как такой тип пишется на C#?
Привет всем! Пдскажите, пожалуйста, как тип VB Object пишется на C# ? Спасибо!

15
Заблокирован
22.06.2012, 10:03 2
zink0000, Господи ты боже мой, а не проще использовать компонент RichTextBox. Вот как у меня получается, смотри картинку. И не надо ничего определять, или конвертировать.

Если вообще я правильно понял поставленную задачу. :cofee2:
Миниатюры
Текстовый формат UNIX: Как быстро идентифицировать такой тип файлов  
1
Заблокирован
22.06.2012, 10:23 3
А вообще на сколько мне известно RichTextBox является наилучшим компонентом для работы с текстом. Он поддерживает сохраненное форматирование текста, его структуру и прочие. Еще если не изменяет память он даже работает с .XML файлами.
1
258 / 107 / 26
Регистрация: 15.03.2012
Сообщений: 353
Записей в блоге: 33
22.06.2012, 10:23  [ТС] 4
inv.DS, TextBox там только для примера, на самом деле идёт построчная загрузка с анализом строк, то-есть нужно распознавать отдельные строки.

Хм... хотя... спасибо... одна мысль появилась, сейчас попробую.
0
Заблокирован
22.06.2012, 10:25 5
Цитата Сообщение от zink0000 Посмотреть сообщение
inv.DS, TextBox там только для примера, на самом деле идёт построчная загрузка с анализом строк, то-есть нужно распознавать отдельные строки.

Хм... хотя... спасибо... одна мысль появилась, сейчас попробую.
Ну так, а уже в самом тексте произвести поиск строк или просто тупо шагать по строкам вниз, пока не достигнем его конца. Тот же пример что-то типа .INI файла.
1
258 / 107 / 26
Регистрация: 15.03.2012
Сообщений: 353
Записей в блоге: 33
22.06.2012, 10:27  [ТС] 6
inv.DS, пытаюсь загрузить ndv-2012-06.gb (23.9Mb)...
Вот, жду пока...

Если сработает, не просто спасибо, а огромное спасибо,
на мысль навели.
0
Заблокирован
22.06.2012, 10:29 7
DoEvents вам в помощь, не дайте проекту зависнуть, или придумайте еще варианты, чтобы не было зависание процесса.
1
258 / 107 / 26
Регистрация: 15.03.2012
Сообщений: 353
Записей в блоге: 33
22.06.2012, 12:14  [ТС] 8
Цитата Сообщение от inv.DS Посмотреть сообщение
DoEvents вам в помощь, не дайте проекту зависнуть, или придумайте еще варианты, чтобы не было зависание процесса.
DoEvents сейчас мне не поможет.
Очень трудно вставить DoEvents в команду Line Input #, Print # или присваивания.

Добавлено через 1 час 13 минут
Ура! Заработало!

Сделаю конвертер в виде отдельной подпрограммы - выставлю сюда.
0
Заблокирован
22.06.2012, 13:26 9
RichTextBox, с ним делал?
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
37302 / 20736 / 4272
Регистрация: 12.02.2012
Сообщений: 34,127
Записей в блоге: 14
22.06.2012, 18:56 10
RichTextBox - вещь хорошая. Но есть и проблема: если придется тиражировать программу - компонент придется регистрировать. И всегда найдется клиент, у которого это не получится из-за прав...

А отличить юниксовый текст от виндузового несложно: читаешь в буфер 200-300 байтов и ищешь
сочетние chr$(13)+chr$(10). Нашёл - win, не нашёл - unix.
1
Заблокирован
22.06.2012, 19:48 11
Вообще данный .OCX компонент идет во многих версиях Windows XP и уж точно есть уже в Windows 7, 8. А регистрировать проблем нет. Я вообще использую архиваторы в Setup файлы, такие как InstallMaker, InstallShield там по умолчанию все можно и настроить.
1
6807 / 2837 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
23.06.2012, 08:43 12
Цитата Сообщение от zink0000 Посмотреть сообщение
Это не было бы проблемой если этот файл
можно загрузить в одну строку,
А если скачивать файл как данные и потом приводить к нормальному Win тексту? В принципе вообще не нужны ни какие сторонние компоненты для этого. Новая процедура:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Private Sub cmdTest_Click()
  Dim sT As String
  Dim sTest As String
  Dim sFn As String
  Dim iFn As Integer
  
  '
  ' Файл-шаблон
  Load frmOpen
  frmOpen.txtFileName = ""
  frmOpen.drvBox.Drive = App.Path
  frmOpen.dirBox.Path = App.Path
  frmOpen.cboExt.Clear
  frmOpen.cboExt.AddItem "GenBank (*.gb*)"
  frmOpen.cboExt.AddItem "Все файлы (*.*)"
  frmOpen.cboExt.ListIndex = 0
  frmOpen.Show 1
  ' Была нажата клавиша "Отмена"
  If "" <> Trim$(frmOpen.Tag) Then
    sFn = frmOpen.Tag
  End If
  Unload frmOpen
  '
  sTest = ""
  iFn = FreeFile
  Open sFn For Binary As #iFn
  MsgBox Str(LOF(iFn))
  sTest = Space$(LOF(iFn)) ' Резервируем размер под строку
  Get #iFn, , sTest
  Close #iFn
   MsgBox "Длина строки =" & Str(Len(sTest)) ' Реальный размер строки - txtTest отображает только 64к
  txtTest.Text = Replace(sTest, Chr$(10), vbCrLf) ' конвертируем Lin в Win
  
End Sub
1
258 / 107 / 26
Регистрация: 15.03.2012
Сообщений: 353
Записей в блоге: 33
25.06.2012, 10:21  [ТС] 13
Цитата Сообщение от inv.DS Посмотреть сообщение
RichTextBox, с ним делал?
Нет, не делал.
Зачем?
Мне вообще выводить этот текст не надо,
только обрабатывать определённым образом и анализировать,
TextBox я лишь для примера использовал чтобы показать,
что весь файл как одна строка грузится.

Добавлено через 3 минуты
Pro_grammer, я немного по другому сделал,
но у Вас тоже вполне разумный вариант решения.
Хм... даже не исключено, что более удачный чем мой...

Добавлено через 9 минут
Эх... только вот-ведь незадача функции Replace в Visual Basic 5.0 похоже нет...

Не по теме:

И не говорите мне - "установите VB6".
Мда, у нас тут свои заморочки...
Ладно не будем о грустном...
Придумаю что-нибудь.

0
258 / 107 / 26
Регистрация: 15.03.2012
Сообщений: 353
Записей в блоге: 33
25.06.2012, 15:16  [ТС] 14
Вроде бы всё нормально работает.
Код, как и обещал, выставляю:
test0015.zip

Собственно одна функция:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Function iTextUnix(sFn As String) As Integer
  ' iTextUnix - функция определяющая текстовые Unix-файлы.
  Dim sT As String
  Dim iFn As Integer
  Dim lLOF As Long
  '
  iTextUnix = False
  iFn = FreeFile
  Open sFn For Input As #iFn
  Line Input #iFn, sT
  If LOF(iFn) = Len(sT) Then
    ' Весь файл загружен, как одна строка.
    iTextUnix = True
  End If
  Close #iFn
End Function
и одна подпрограмма:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Sub TextUnixToWin(sFn As String)
  ' TextUnixToWin - подпрограмма конвертирует текстовый файл
  ' в формате Unix в формат Windows.
  Dim sT As String
  Dim sTL As String
  Dim iFn As Integer
  '
  iFn = FreeFile
  Open sFn For Input As #iFn
  Line Input #iFn, sT
  Close #iFn
  '
  If 0 <> InStr(sT, Chr$(13) + Chr$(10)) Then
    ' Конвертация не требуется.
    Exit Sub
  End If
  iFn = FreeFile
  Open sFn For Output As #iFn
  Do While True
    If 0 <> InStr(sT, Chr$(10)) Then
      sTL = sLeftCut(sT, Chr$(10))
      Print #iFn, sTL
    Else
      If 0 <> Len(sT) Then
        Print #iFn, sT
        Exit Do
      Else
        Exit Do
      End If
    End If
  Loop
  Close #iFn
End Sub
Если будете пользоваться, обратите внимание,
конвертация идёт в тот же файл из которого данные и были загружены.
0
Эксперт WindowsАвтор FAQ
18008 / 7709 / 892
Регистрация: 25.12.2011
Сообщений: 11,483
Записей в блоге: 16
26.06.2012, 02:12 15
Что за функция такая sLeftCut? (строка 21)
Строка 13 - так используйте ту же конструкцию - строка № 11 из кода № 1.

Добавлено через 9 минут
Вот из-за горбушки конвертация в обе стороны:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Public Enum ConvertType
dos2unix = 0
unix2dos = 1
End Enum
 
Public Function ConvertFile(OriginalFile As String, NewFile As String, eConvertType As ConvertType, _
Optional DeleteOriginal As Boolean = False)
 
Dim OpenFileNum, SaveFileNum As Integer
Dim NewFileBuffer As String
 
' We accept data only from
' This function will open a file and convert it to
' a txt file format usable under *nix or dos
On Error GoTo Error_Found
 
OpenFileNum = FreeFile ' grab the first free file
Open OriginalFile For Input As #OpenFileNum ' open the unix file
SaveFileNum = FreeFile ' get another free file to write to
Open NewFile For Binary As #SaveFileNum ' open/create the save file
Do While Not EOF(OpenFileNum)
    Line Input #OpenFileNum, NewFileBuffer ' retrive the text (if a unix file, then the entire text is on one line)
    If eConvertType = dos2unix Then ' Check what type of conversion to do
        NewFileBuffer = NewFileBuffer & Chr(10)
      Else
        NewFileBuffer = Replace(NewFileBuffer, Chr(10), vbCrLf)
    End If
    Put #SaveFileNum, , NewFileBuffer ' write out the file
Loop
Close #SaveFileNum
Close #OpenFileNum
 
If DeleteOriginal = True Then Kill OriginalFile
 
Exit Function
 
Error_Found:
MsgBox "Error: " & Err.Description & vbCrLf & "Number: " & Err.Number
Exit Function
 
End Function
Добавлено через 21 минуту
Хм, наверно так:
Visual Basic
1
2
3
4
5
6
Function sLeftCut$(ByRef sT$, ByVal Delim$)
  Dim pos&
  pos = InStr(sT, Delim)
  sLeftCut = Left$(sT, pos)
  sT = Right$(sT, Len(sT) - pos)
End Function
1
258 / 107 / 26
Регистрация: 15.03.2012
Сообщений: 353
Записей в блоге: 33
27.06.2012, 08:51  [ТС] 16
Diskretor, вообще-то функция выглядит так:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Function sLeftCut(sA, sB As String) As String
  ' sLeftCut - урезает строку слева до последовательности
  ' символов определенных во второй строке.
  '
  ' sA - урезаемая строка
  ' sB - искомая строка
  If Len(sA) = 0 Then
    sLeftCut = ""
    Exit Function
  ElseIf Len(sB) = 0 Then
    sLeftCut = ""
    Exit Function
  ElseIf InStr(sA, sB) = 0 Then
    sLeftCut = ""
    Exit Function
  End If
  '
  sLeftCut = Left$(sA, InStr(sA, sB) - 1)
  sA = Right$(sA, Len(sA) - InStr(sA, sB) - Len(sB) + 1)
End Function
но по сути - верно.

Поправка на счёт ByRef, ByVal принимается, спасибо.
0
27.06.2012, 08:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.06.2012, 08:51
Помогаю со студенческими работами здесь

Как преобразовать время UNIX в удобовоспринимаемый формат даты?
Здравствуйте. Есть вот такой вот скрипт: while($data = mysql_fetch_array($qr_result)){ echo...

Нужен совет по видеомонтажу: Как быстро изменить формат?
Люди, хорошо понимающие в видеомонтаже - надеюсь на Вашу помощь! Программа Camtasia studio не...

Как максимально быстро вывести данные в таблицу (формат Excel)?
Здравствуйте знатоки. Нужна помощь. Столкнулся с такой проблемой: есть большущая программа,...

Как быстро считать текстовый файл?
С помощью FSO методами ReadAll,ReadLine файл считывается, но если он большой, то очень долго....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru