Показать полную графическую версию : Расположение текста в файле в 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-скриптом.
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, "Преобразование файла")
Serg2010, ESC-последовательности случайно не используются? ;)
megaloman
28-08-2009, 18:31
Serg2010, Естественно, при применеиии по исходному тексту непечатных символов, управляющих работой принтера, результат работы моего скрипта при печати будет непредсказуемым, хотя, формально, он текст разобъет на колонки.
Но как поставлена задача ... В принципе, можно просмотреть исходный текст и уничтожить все непечатные символы, но в ESC последовательности может входить что угодно, поэтому этого делать нельзя. Но, судя по тому, что Вам хватало и редактора FAR, проблем не должно возникнуть.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.