PDA

Показать полную графическую версию : Расположение текста в файле в 2 колонки


Serg2010
26-08-2009, 19:08
Доброго времени суток!

Текстовый файл содержащий большое количество справок. Справки расположены в одну колонку, представляют собой текстовый блок шириной в 44 символа и длиной в 17 строк. Между ними 1-2 пустые строки для разрезания. Эти справки будут печататься на рулонной бумаге на матричном банковском принтере. Для экономии бумаги и времени нужно чтобы все справки располагались в 2 колонки, допустим уже с 47 позиции символа. Т.е. на одном уровне должно располагаться справка 1-2, ниже 3-4 и т.д. Длина блока одинаковая, но лучше рассмотреть такой вариант когда длины разные и нужно дополнение нужного количества строк до длины самого длинного блока - тогда после расположения справок в 2 колонки между ними будет промежуток для разрезания. Определение длины са мого длинного блока в принципе если сильно сложно можно вводить как параметр и определять визуально вручную. Главное - текст расположить в 2 колонки.

Попробуем?

P.S. А может если ширина бумаги позволяет даже замахнуться на расположение в 3 колонки? Желательно бы регулировать ...
Когда то я эту задачу решал копирование блока в ФАРе и вставкой, НО длина блоков может быть разная и потом не порежишь и нумерация не атк как нужно была: 2 колонка продолжала с того номера на каком заканчивалась 1 колонка ...

megaloman
27-08-2009, 00:24
Конкретнее: чем начинается справка, чем кончается. Особенно это необходимо, если справки разной длины. Фраза "длиной в 17 строк. Между ними 1-2 пустые строки" не очень годится для программирования - должно быть что-то жесткое. А, в принципе, задачка легко решается VBS-скриптом.

amel27
27-08-2009, 09:32
Serg2010, батники плохо подходят для обработки произвольного текста, так как некоторые символы текста могут совпасть с метасимволами самого командного интерпретатора (например, "&|^")

megaloman
27-08-2009, 10:06
батники плохо подходят для обработки произвольного текста задачка легко решается VBS-скриптом. -то есть я предполагаю решать задачу на Visual Basic Script, там мне не известны проблемы с текстовыми символами. Это средство имеется в наличии на каждом компьютере с системой, начиная с Windows 98. Попутно - сколько ориентировочно строк в текстовом файле? Это существенно для организации оптимального чтения - записи файла.

megaloman
27-08-2009, 19:39
Вот решение задачи, как Вы её поставили.
Предполагается что все справки одинаковы по числу строк
Файл длиной 100000 строк у меня преобразовывался менее 2 сек.
Скопируйте текст скрипта в блокнот, сохраните в файл с расширением VBS (например txt_stolb.VBS ) настройте свои пути к файлам и параметры документа. Запускайте в проводнике (или в FAR-е, коль Вы им пользуетесь) как исполнимый файл
Проверено - работает.
Осознаю, что скрипт Вас не устроит, но как поставлена задача, так она и сделана.
Доработки, конечно, возможны. Принцип формирования файла тут заложен хороший.

' Скрипт из исходного текстового файла делает другой текстовый файл
' В котором исходный текст располагается заданным числом столбцов
' Блоками указанной длины (в строках)
' Нумерация блоков (в случае 3 столбцов)
' 1 2 3
' 4 5 6
' 7 8 9
' и т д.

' Необходимо настроить: ------------------------
InText = "E:\Delete\Text.txt"
OutText = "E:\Delete\TextOut.txt"

WStrok = 67 ' Число символов в строке
LStrok = 17 ' Число строк в блоке

NCol = 3 ' Число столбцов в выходном файле
WPole = 10 ' Число пробелов между столбцами
' ----------------------------------------------

ReDim OutStr(LStrok - 1, NCol - 1)
Messa = ""

Pusto = String(WStrok, " ")
Probel = String(WPole, " ")

Set FSO = CreateObject("Scripting.FileSystemObject")

On Error Resume Next
Set F1 = FSO.OpenTextFile(InText, 1, False)

If Err.Number = 0 Then
Messa = CStr(Time) + " Открыт файл " + InText + Chr(13) + Chr(10)

' Читаем исходный файл в массив
iString = F1.ReadAll()
F1.Close
iString = Replace(iString, Chr(10), "")
Mass = Split(iString, Chr(13))
iString = ""
N = UBound(Mass)

' выравниваем строки по ширине
For i = 0 To N
Mass(i) = Mid(Mass(i) + Pusto, 1, WStrok)
Next

Set F1 = FSO.OpenTextFile(OutText, 2, True) ' Создаём выходной файл

' Цикл по началам блоков

L = -1
For i = 0 To N Step LStrok
If L < 0 Then ' Готовим чистый бланк из нескольких колонок
For j = 0 To LStrok - 1
For k = 0 To NCol - 1
OutStr(j, k) = ""
Next
Next
End If

ii = i + LStrok - 1
If ii > N Then ii = N ' Заполняем бланк текстом
L = L + 1
For j = i To ii
OutStr(j - i, L) = Mass(j)
Next

If L = NCol - 1 Then
L = -1
iString = ""
For j = 0 To LStrok - 1
iString = iString + OutStr(j, 0)
If NCol > 1 Then
For k = 1 To NCol - 1
iString = iString + Probel + OutStr(j, k)
Next
End If
iString = iString + Chr(13) + Chr(10)
Next
F1.WriteLine iString

End If
Next

If L >= 0 Then
iString = ""
For j = 0 To LStrok - 1
iString = iString + OutStr(j, 0)
If LCol > 1 Then
For k = 1 To NCol - 1
iString = iString + Probel + OutStr(j, k)
Next
End If
iString = iString + Chr(13) + Chr(10)
Next
F1.WriteLine iString
End If

' Записываем результат в файл

' Set F1 = FSO.OpenTextFile(OutText, 2, True)

' For i = 0 To N
' F1.WriteLine Right("000000" + CStr(i) + " ", 7) + Mass(i)
' Next

F1.Close

Messa = Messa + CStr(Time) + " Записан файл " + OutText + Chr(13) + Chr(10)
Messa = Messa + CStr(Time) + " Преобразование завершено"

Else
Messa = "Ошибка при открытии файла " + Chr(13) + Chr(10) + InText + Chr(13) + Chr(10) + Err.Description

End If
L = MsgBox(Messa, 0, "Преобразование файла")

amel27
28-08-2009, 06:37
Serg2010, ESC-последовательности случайно не используются? ;)

megaloman
28-08-2009, 18:31
Serg2010, Естественно, при применеиии по исходному тексту непечатных символов, управляющих работой принтера, результат работы моего скрипта при печати будет непредсказуемым, хотя, формально, он текст разобъет на колонки.
Но как поставлена задача ... В принципе, можно просмотреть исходный текст и уничтожить все непечатные символы, но в ESC последовательности может входить что угодно, поэтому этого делать нельзя. Но, судя по тому, что Вам хватало и редактора FAR, проблем не должно возникнуть.




© OSzone.net 2001-2012