Что нового

Выравнять текст (колонки) в txt-файле

DyadyaGenya

Новичок
Сообщения
238
Репутация
0
Доброго времени суток. Получаю текстовый файл как бы из двух колонок, сформированных с помощью таба по типу:
Код:
Название    1
Название два    3
Наз    2
Длинное название    5

Не могу придумать как выравнять, чтоб было:

Код:
Название        1
Название два    3
Наз             2
Длинное название5


Пока кроме подсчета символов в строке и добавление до максимального значения ничего в голову не приходит. Но это очень длинный путь. Может можно как-то проще?
 

Oki

Новичок
Сообщения
82
Репутация
4
Выравнивание не является характеристикой файла вне контекста программы, которой текстовый файл просматривается. Так что даже считать символы поможет лишь тогда, когда учитывается способ отображения. В частности, он обычно может быть таковым, что ширина демонстрируемого символа зависит от того, какой это символ. Но это мелочи в сравнении с тем, что ширину колонок каждая программа может устанавливать свою собственную. Так что один текстовый редактор может показать красиво выровненный текст, тогда как другой тот же текст скомкает, посчитав, что табуляцию следует делать не в ту колонку, которая задумывалась.
 
Последнее редактирование:

IMStrelcov

CTPEJIbLLOB
Сообщения
212
Репутация
42
В любом случае придется подсчитывать кол-во символов.
Для выравнивания можно использовать табы или StringFormat().
При использовании StringFormat() достаточно знать максимальную длину допустимого слова,
но все равно придется разбивать файл на строки, а строки делить на слово и число.
Так же при использовании StringFormat() между словом и числом будут пробелы, это не то, если программа в которой потом просматривать файл, использует шрифт не с равномерными по ширине символами.
 

Norm

Осваивающий
Сообщения
134
Репутация
21
Вот здесь почти готовое решение, но опять же всё будет упираться только в программу, в которой этот текст будет отображаться.
Код:
========================================================================================
Имя функции             |Адрес      |Относительный адрес |Путь                         |
========================================================================================
D2D1ConvertColorSpace   |0x1020DB46 |0x0020DB46          |C:\Windows\system32\d2d1.dll |
D2D1CreateDevice        |0x1020DC29 |0x0020DC29          |C:\Windows\system32\d2d1.dll |
D2D1CreateDeviceContext |0x1020DD4F |0x0020DD4F          |C:\Windows\system32\d2d1.dll |
D2D1SinCos              |0x1020DEC2 |0x0020DEC2          |C:\Windows\system32\d2d1.dll |
D2D1Tan                 |0x1020DF27 |0x0020DF27          |C:\Windows\system32\d2d1.dll |
D2D1Vec3Length          |0x1020DF6A |0x0020DF6A          |C:\Windows\system32\d2d1.dll |
D2D1CreateFactory       |0x1020E11E |0x0020E11E          |C:\Windows\system32\d2d1.dll |
D2D1MakeRotateMatrix    |0x102153A1 |0x002153A1          |C:\Windows\system32\d2d1.dll |
D2D1MakeSkewMatrix      |0x102153E6 |0x002153E6          |C:\Windows\system32\d2d1.dll |
D2D1IsMatrixInvertible  |0x10215433 |0x00215433          |C:\Windows\system32\d2d1.dll |
D2D1InvertMatrix        |0x102154AC |0x002154AC          |C:\Windows\system32\d2d1.dll |
========================================================================================
Total count: 11                                              TimeStamp: 02.03.2014 17.30
 
Автор
D

DyadyaGenya

Новичок
Сообщения
238
Репутация
0
Так что один текстовый редактор может показать красиво выровненный текст, тогда как другой тот же текст скомкает, посчитав, что табуляцию следует делать не в ту колонку, которая задумывалась.
Да, уже проверил. Вроде и файл отформатирован, но из txt в вайбер вставляется криво. Там на приблизительно 23 буквы может приходится 34 пробела
Для выравнивания можно использовать табы или StringFormat().
Спасибо за наводку, сделал подобный вариант. Ниже.
Что-то сходу не разобрался, (не запустился пример), но думаю мой вариант работает по сходному принципу.
Код:
#include <File.au3>
#include <Array.au3>

 Global $aArray2d[0][2]
_ArrayAdd($aArray2d, "строка 1" & "|" & "5")
_ArrayAdd($aArray2d, "строка короче 2" & "|" & "5")
_ArrayAdd($aArray2d, "строчка 3" & "|" & "12")
_ArrayAdd($aArray2d, "строчечка 4" & "|" & "15")

   _ArrayDisplay($aArray2d)

Local $aLong[0]
For $j = 0 to UBound($aArray2d)-1
   Local $sLong = StringLen($aArray2d[$j][0])
   ConsoleWrite("длинна строки: " & $aArray2d[$j][0] & " = " & $sLong & @CR)
   _ArrayAdd($aLong, $sLong)
Next

Local $maxSimbol = _ArrayMax($aLong, 1)+3
ConsoleWrite("максимальное число символов в строке с добавочными тремя, чтоб в будущем не сливалось в результирующей строке " & $maxSimbol & @CR)

Local $aFile = FileOpen(@ScriptDir & '\test.txt', 2)

For $a = 0 to UBound($aArray2d)-1
Local $sLine = $aArray2d[$a][0] & _Dots($maxSimbol-$aLong[$a]) & $aArray2d[$a][1]
ConsoleWrite($sLine & @CR)
FileWriteLine($aFile, $sLine)
Next

 Func _Dots($iCount)
    Return StringReplace(StringFormat('%' & $iCount & 's', ''), ' ', ' ') ; тут поставил пробелы, но можно любой символ использовать, подсмотрел тут https://autoit-script.ru/threads/kak-dobavit-n-oe-kolichestvo-odinakovyx-simvolov-v-konec-stroki.7465/#post-51197
EndFunc

Для вставки в вайбер слегка усложнил с учетом пересчета пробелов на один таб.

И у меня ещё одна непонятная ситуация. В отдельную тему не хотелось бы выносить, вроде маленькая проблема. Но не смог придумать и найти в справке как поставить несколько @TAB
 

Oki

Новичок
Сообщения
82
Репутация
4
И у меня ещё одна непонятная ситуация. В отдельную тему не хотелось бы выносить, вроде маленькая проблема. Но не смог придумать и найти в справке как поставить несколько @TAB
В цикле или же через амперсанд, когда количество константно.
 
Автор
D

DyadyaGenya

Новичок
Сообщения
238
Репутация
0
В цикле или же через амперсанд, когда количество константно
Я в принципе понимаю, что через амперсанд, но как именно? Вот один из вариантов:
Код:
_ArrayAdd($colikoTab, @TAB{2})
_ArrayAdd($colikoTab, @TAB^ ERROR

Наверно все таки придется создавать новую тему, хоть вопрос и маленький, и ответ лежит явно на поверхности.
 
Последнее редактирование:
Верх