Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Расположение текста в файле в 2 колонки (http://forum.oszone.net/showthread.php?t=148970)

Serg2010 26-08-2009 19:08 1203974

Расположение текста в файле в 2 колонки
 
Доброго времени суток!

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

Попробуем?

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

megaloman 27-08-2009 00:24 1204235

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

amel27 27-08-2009 09:32 1204384

Serg2010, батники плохо подходят для обработки произвольного текста, так как некоторые символы текста могут совпасть с метасимволами самого командного интерпретатора (например, "&|^")

megaloman 27-08-2009 10:06 1204407

Цитата:

батники плохо подходят для обработки произвольного текста
Цитата:

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

megaloman 27-08-2009 19:39 1204823

Вот решение задачи, как Вы её поставили.
Предполагается что все справки одинаковы по числу строк
Файл длиной 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 1205179

Serg2010, ESC-последовательности случайно не используются? ;)

megaloman 28-08-2009 18:31 1205707

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


Время: 03:36.

Время: 03:36.
© OSzone.net 2001-