Align columns: Difference between revisions

Added XPL0 example.
(Added XPL0 example.)
 
(17 intermediate revisions by 12 users not shown)
Line 30:
=={{header|11l}}==
{{trans|D}}
<langsyntaxhighlight lang="11l">V txt = ‘Given$a$txt$file$of$many$lines,$where$fields$within$a$line$
are$delineated$by$a$single$'dollar'$character,$write$a$program
that$aligns$each$column$of$fields$by$ensuring$that$words$in$each$
Line 53:
print(justify(word, max_widths[L.index]), end' ‘ ’)
print()
print(‘- ’ * 52)</langsyntaxhighlight>
 
=={{header|360 Assembly}}==
<langsyntaxhighlight lang="360asm">* Align columns 12/04/2019
ALICOL CSECT
USING ALICOL,R13 base register
Line 235:
PG DS CL120
REGEQU
END ALICOL </langsyntaxhighlight>
{{out}}
<pre>
Line 262:
 
=={{header|8th}}==
<syntaxhighlight lang="forth">
<lang Forth>
quote | Given$a$text$file$of$many$lines,$where$fields$within$a$line$
are$delineated$by$a$single$'dollar'$character,$write$a$program
Line 308:
bye ;
 
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 337:
=={{header|AArch64 Assembly}}==
{{works with|as|Raspberry Pi 3B version Buster 64 bits <br> or android 64 bits with application Termux }}
<syntaxhighlight lang="aarch64 assembly">
<lang AArch64 Assembly>
/* ARM assembly AARCH64 Raspberry PI 3B or android 64 bits */
/* program alignColumn64.s */
Line 666:
/* for this file see task include a file in language AArch64 assembly */
.include "../includeARM64.inc"
</syntaxhighlight>
</lang>
<pre>
LEFT :
Line 693:
</pre>
=={{header|ABAP}}==
<langsyntaxhighlight ABAPlang="abap">report z_align no standard page header.
start-of-selection.
 
Line 769:
sy-linno = sy-linno - 1.
endloop.
endform.</langsyntaxhighlight>
 
<pre style="height:15ex;overflow:scroll">Given a text file of many lines, where fields within a line
Line 794:
=={{header|Action!}}==
Atari 8-bit computer is able to show only 40 characters per line. The user has to press left/right arrow keys to scroll the content of whole text.
<langsyntaxhighlight Actionlang="action!">DEFINE LINES_COUNT="10"
DEFINE COLUMNS_COUNT="20"
DEFINE WORDS_COUNT="100"
Line 1,002:
OD
 
RETURN</langsyntaxhighlight>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Align_columns.png Screenshot from Atari 8-bit computer]
Line 1,032:
=={{header|Ada}}==
{{libheader|Simple components for Ada}}
<langsyntaxhighlight lang="ada">with Ada.Characters.Latin_1; use Ada.Characters.Latin_1;
with Ada.Text_IO; use Ada.Text_IO;
with Strings_Edit; use Strings_Edit;
Line 1,096:
end loop;
Close (File);
end Column_Aligner;</langsyntaxhighlight>
Formatted file sample:
<pre style="height:15ex;overflow:scroll">
Line 1,120:
 
=={{header|Aime}}==
<langsyntaxhighlight lang="aime">data b;
file f;
text n, t;
Line 1,164:
}
o_newline();
}</langsyntaxhighlight>
{{Out}}
<pre>left justified
Line 1,191:
 
=={{header|ALGOL 68}}==
<langsyntaxhighlight lang="algol68">STRING nl = REPR 10;
STRING text in list := "Given$a$text$file$of$many$lines,$where$fields$within$a$line$"+nl+
"are$delineated$by$a$single$'dollar'$character,$write$a$program"+nl+
Line 1,256:
aligner(page, align OF aligners[index])
OD
END</langsyntaxhighlight>
 
=={{header|Amazing Hopper}}==
<syntaxhighlight lang="amazing hopper">
<lang Amazing Hopper>
#define IGet(__N__,__X__) [__N__]SGet(__X__)
 
Line 1,310:
Print("Left Pad:\n", display Left, Newl, "Right Pad:\n", display Right, Newl, "Center Pad:\n", display Center,Newl)
End
</syntaxhighlight>
</lang>
{{out}}
Sample String was saved into "sample.txt" file.
Line 1,341:
</pre>
 
=={{header|APL}}==
<syntaxhighlight lang="apl">align←{
left ← {⍺↑⍵}
right ← {(-⍺)↑⍵}
center ← {⍺↑(-⌊(≢⍵)+(⍺-≢⍵)÷2)↑⍵}
text ← ⊃⎕NGET⍵
words ← ((≠∘'$')⊆⊣)¨(~text∊⎕TC)⊆text
sizes ← 1+⌈⌿↑≢¨¨words
method ← ⍎⍺
↑,/↑(⊂sizes)method¨¨↓↑words
}</syntaxhighlight>
{{out}}
<pre> 'left' align 'test.txt'
Given a text file of many lines, where fields within a line
are delineated by a single 'dollar' character, write a program
that aligns each column of fields by ensuring that words in each
column are separated by at least one space.
Further, allow for each word in a column to be either left
justified, right justified, or center justified within its column.
'center' align 'test.txt'
Given a text file of many lines, where fields within a line
are delineated by a single 'dollar' character, write a program
that aligns each column of fields by ensuring that words in each
column are separated by at least one space.
Further, allow for each word in a column to be either left
justified, right justified, or center justified within its column.
'right' align 'test.txt'
Given a text file of many lines, where fields within a line
are delineated by a single 'dollar' character, write a program
that aligns each column of fields by ensuring that words in each
column are separated by at least one space.
Further, allow for each word in a column to be either left
justified, right justified, or center justified within its column.</pre>
=={{header|AppleScript}}==
 
Line 1,346 ⟶ 1,380:
 
{{trans|JavaScript}}
<langsyntaxhighlight AppleScriptlang="applescript">-- COLUMN ALIGNMENTS ---------------------------------------------------------
 
property pstrLines : ¬
Line 1,597 ⟶ 1,631:
return lst
end tell
end zipWith</langsyntaxhighlight>
{{Out}}
<pre> Given a text file of many lines, where fields within a line
Line 1,619 ⟶ 1,653:
Further, allow for each word in a column to be either left
justified, right justified, or center justified within its column. </pre>
 
=={{header|ARM Assembly}}==
{{works with|as|Raspberry Pi <br> or android 32 bits with application Termux}}
<syntaxhighlight lang="arm assembly">
<lang ARM Assembly>
/* ARM assembly Raspberry PI */
/* program alignColumn.s */
Line 1,947 ⟶ 1,982:
/***************************************************/
.include "../affichage.inc"
</syntaxhighlight>
</lang>
<pre>
LEFT :
Line 1,974 ⟶ 2,009:
</pre>
=={{header|Arturo}}==
<langsyntaxhighlight lang="rebol">text: {
Given$a$text$file$of$many$lines,$where$fields$within$a$line$
are$delineated$by$a$single$'dollar'$character,$write$a$program
Line 1,983 ⟶ 2,018:
}
 
output: map split.lines text => [split.by:"$" &]
 
loop output 'line [
loop line 'word -> prints pad word 12
print ""
]</langsyntaxhighlight>
 
{{out}}
Line 2,001 ⟶ 2,036:
=={{header|AutoHotkey}}==
 
<langsyntaxhighlight AutoHotkeylang="autohotkey">Alignment := "L" ; Options: L, R, C
Text =
( LTrim
Line 2,049 ⟶ 2,084:
Return Ret
}
</syntaxhighlight>
</lang>
 
=={{header|AutoIt}}==
<syntaxhighlight lang="autoit">
<lang AutoIt>
; == If the given text is in an file, it will read with:
#include <File.au3>
Line 2,136 ⟶ 2,171:
EndSwitch
EndFunc ;==>_GetAligned
</syntaxhighlight>
</lang>
Example output in Alignment: left - center - right - left - center - right - left - center - right - left - center - right
<pre>
Line 2,148 ⟶ 2,183:
 
=={{header|AWK}}==
<syntaxhighlight lang="awk">
<lang AWK>
# syntax: GAWK -f ALIGN_COLUMNS.AWK ALIGN_COLUMNS.TXT
BEGIN {
Line 2,190 ⟶ 2,225:
}
function max(x,y) { return((x > y) ? x : y) }
</syntaxhighlight>
</lang>
<p>Output:</p>
<pre>
Line 2,227 ⟶ 2,262:
 
=={{header|BaCon}}==
<langsyntaxhighlight lang="freebasic">
DECLARE in$[] = { "Given$a$text$file$of$many$lines,$where$fields$within$a$line$", \
"are$delineated$by$a$single$'dollar'$character,$write$a$program", \
Line 2,262 ⟶ 2,297:
Print_In_Columns(1)
Print_In_Columns(2)
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 2,292 ⟶ 2,327:
==={{header|BBC BASIC}}===
{{works with|BBC BASIC for Windows}}
<langsyntaxhighlight lang="bbcbasic"> DATA 6
DATA "Given$a$text$file$of$many$lines,$where$fields$within$a$line$"
DATA "are$delineated$by$a$single$'dollar'$character,$write$a$program"
Line 2,347 ⟶ 2,382:
WHEN "right": = STRING$(field%-LEN(word$), " ") + word$
ENDCASE
= word$</langsyntaxhighlight>
 
==={{header|Commodore BASIC}}===
<langsyntaxhighlight lang="basic">10 rem ********************************
20 rem print words in columns
30 rem commodore basic 2.0
Line 2,415 ⟶ 2,450:
640 data "column$are$separated$by$at$least$one$space."
650 data "Further,$allow$for$each$word$in$a$column$to$be$either$left$"
660 data "justified,$right$justified,$or$center$justified$within$its$column"</langsyntaxhighlight>
 
=={{header|Batch File}}==
<langsyntaxhighlight lang="dos">@echo off
setlocal enabledelayedexpansion
mode con cols=103
Line 2,501 ⟶ 2,536:
)
endlocal & set %~2=%len%
exit /b</langsyntaxhighlight>
{{out}}
<pre>Given a text file of many lines where fields within a line
Line 2,525 ⟶ 2,560:
 
=={{header|Beads}}==
<langsyntaxhighlight lang="beads">beads 1 program 'Align columns'
const
Line 2,577 ⟶ 2,612:
log "\n{v} justified\n"
div_line
show_table(v)</langsyntaxhighlight>
 
{{out}}
Line 2,629 ⟶ 2,664:
=={{header|BQN}}==
A function which returns a rectangular 2D array which represents the lines.
<langsyntaxhighlight lang="bqn">Split ← (⊢-˜+`׬)∘=⊔⊢
PadRow ← {
w‿t𝕊𝕩: # t → type.
Line 2,640 ⟶ 2,675:
Align ← {{𝕨∾' '∾𝕩}´˘⍉" "‿𝕨⊸PadRow˘⍉>⟨""⟩‿0 PadRow '$' Split¨(@+10) Split 𝕩}
 
1 Align text</langsyntaxhighlight>
<langsyntaxhighlight lang="bqn">┌─
╵" Given a text file of many lines, where fields within a line
are delineated by a single 'dollar' character, write a program
Line 2,648 ⟶ 2,683:
Further, allow for each word in a column to be either left
justified, right justified, or center justified within its column. "
┘</langsyntaxhighlight>
[https://mlochbaum.github.io/BQN/try.html#code=dGV4dOKGkCJHaXZlbiRhJHRleHQkZmlsZSRvZiRtYW55JGxpbmVzLCR3aGVyZSRmaWVsZHMkd2l0aGluJGEkbGluZSQKYXJlJGRlbGluZWF0ZWQkYnkkYSRzaW5nbGUkJ2RvbGxhcickY2hhcmFjdGVyLCR3cml0ZSRhJHByb2dyYW0KdGhhdCRhbGlnbnMkZWFjaCRjb2x1bW4kb2YkZmllbGRzJGJ5JGVuc3VyaW5nJHRoYXQkd29yZHMkaW4kZWFjaCQKY29sdW1uJGFyZSRzZXBhcmF0ZWQkYnkkYXQkbGVhc3Qkb25lJHNwYWNlLgpGdXJ0aGVyLCRhbGxvdyRmb3IkZWFjaCR3b3JkJGluJGEkY29sdW1uJHRvJGJlJGVpdGhlciRsZWZ0JApqdXN0aWZpZWQsJHJpZ2h0JGp1c3RpZmllZCwkb3IkY2VudGVyJGp1c3RpZmllZCR3aXRoaW4kaXRzJGNvbHVtbi4iCgpTcGxpdCDihpAgKOKKoi3LnCtgw5fCrCniiJg94oqU4oqiClBhZFJvdyDihpAgewogIHfigL908J2VivCdlak6ICMgdCDihpIgdHlwZS4KICAgICAgICAjIDAg4oaSIGxlZnQKICAgICAgICAjIDEg4oaSIHJpZ2h0CiAgICAgICAgIyAyIOKGkiBjZW50ZXIKIHBzdHlsZeKGkHTiipHin6h7MOKAv/Cdlal9LHvwnZWp4oC/MH0se+KfqOKMivCdlanDtzIs4oyI8J2VqcO3MuKfqX3in6kKIPCdlal7KOKKo+KIvvCdlajiiL7iiqIpwrQoUHN0eWxlIPCdlakpL8KoPHd9wqgo4oyIwrQt4oqiKeKJoMKo8J2VqQp9CkFsaWduIOKGkCB7e/CdlajiiL4nICfiiL7wnZWpfcK0y5jijYkiICLigL/wnZWo4oq4UGFkUm93y5jijYk+4p+oIiLin6nigL8wIFBhZFJvdyAnJCcgU3BsaXTCqChAKzEwKSBTcGxpdCDwnZWpfQoKMSBBbGlnbiB0ZXh0CgoK Try It!]
 
Line 2,660 ⟶ 2,695:
{{works with|C sharp|C#|2+}}
 
<langsyntaxhighlight lang="csharp">using System;
class ColumnAlignerProgram
{
Line 2,733 ⟶ 2,768:
}
}
}</langsyntaxhighlight>
 
===Newer version===
Line 2,739 ⟶ 2,774:
 
{{works with|C sharp|C#|8+}}
<langsyntaxhighlight lang="csharp">using System;
using System.Linq;
 
Line 2,790 ⟶ 2,825:
}
 
}</langsyntaxhighlight>
{{out}}
<pre style="height:30ex;overflow:scroll">
Line 2,821 ⟶ 2,856:
 
=={{header|Clojure}}==
<syntaxhighlight lang="clojure">
<lang Clojure>
(ns rosettacode.align-columns
(:require [clojure.contrib.string :as str]))
Line 2,863 ⟶ 2,898:
 
(print-table (aligned-table table :center))
</syntaxhighlight>
</lang>
 
=={{header|COBOL}}==
<langsyntaxhighlight lang="cobol">
identification division.
program-id. AlignColumns.
Line 2,950 ⟶ 2,985:
end-perform
.
</syntaxhighlight>
</lang>
{{out}}
<syntaxhighlight lang="text">
------------------------------------------------------------------------------------------------------------------------
Given a text file of many lines, where fields within a line
Line 2,974 ⟶ 3,009:
Further, allow for each word in a column to be either left
justified, right justified, or center justified within its column.
</syntaxhighlight>
</lang>
 
=={{header|CoffeeScript}}==
<langsyntaxhighlight lang="coffeescript">
pad = (n) ->
s = ''
Line 3,026 ⟶ 3,061:
console.log "\n----- #{alignment}"
align input, alignment
</syntaxhighlight>
</lang>
{{out}}
<syntaxhighlight lang="text">
> coffee align_columns.coffee
 
Line 3,054 ⟶ 3,089:
Further, allow for each word in a column to be either left
justified, right justified, or center justified within its column.
</syntaxhighlight>
</lang>
 
=={{header|Common Lisp}}==
<langsyntaxhighlight lang="lisp">(defun nonempty (seq)
(position-if (lambda (x) (declare (ignore x)) t) seq))
 
Line 3,104 ⟶ 3,139:
(format s "~~~d~a<~~a~~>" (1+ w) fmtmod))
(princ "~}~%~}" s))
fields))</langsyntaxhighlight>
 
=={{header|D}}==
<langsyntaxhighlight lang="d">void main() {
import std.stdio, std.string, std.algorithm, std.range, std.typetuple;
 
Line 3,128 ⟶ 3,163:
writefln("%-(%s %)", line.length.iota
.map!(i => just(line[i], maxWidths[i], ' ')));
}</langsyntaxhighlight>
{{out}}
<pre>Given a txt file of many lines, where fields within a line
Line 3,151 ⟶ 3,186:
=={{header|Delphi}}==
{{libheader|Delphi StdCtrls, Classes, SysUtils, StrUtils, Contnrs}}
<syntaxhighlight lang="delphi">
<lang Delphi>
USES
StdCtrls, Classes, SysUtils, StrUtils, Contnrs;
Line 3,208 ⟶ 3,243:
END;
end;
</syntaxhighlight>
</lang>
 
=={{header|E}}==
 
<langsyntaxhighlight lang="e">pragma.enable("accumulator")
 
def left(width, word) {
Line 3,240 ⟶ 3,275:
} + "\n"
}
}</langsyntaxhighlight>
 
<langsyntaxhighlight lang="e">? def text := "Given$a$text$file$of$many$lines,$where$fields$within$a$line$
are$delineated$by$a$single$'dollar'$character,$write$a$program
that$aligns$each$column$of$fields$by$ensuring$that$words$in$each$
Line 3,271 ⟶ 3,306:
column are separated by at least one space.
Further, allow for each word in a column to be either left
justified, right justified, or center justified within its column.</langsyntaxhighlight>
 
=={{header|EasyLang}}==
{{trans|AWK}}
 
<syntaxhighlight>
global width inp$[] .
proc read . .
repeat
inp$ = input
until inp$ = ""
inp$[] &= inp$
ar$[] = strsplit inp$ "$"
for s$ in ar$[]
width = higher width len s$
.
.
.
read
#
proc out mode . .
for inp$ in inp$[]
ar$[] = strsplit inp$ "$"
for s$ in ar$[]
spc = width - len s$ + 1
if mode = 1
write s$
for i to spc
write " "
.
elif mode = 2
for i to spc
write " "
.
write s$
elif mode = 3
for i to spc div 2
write " "
.
write s$
for i to spc - spc div 2
write " "
.
.
.
print ""
.
.
out 1
print ""
out 2
print ""
out 3
#
input_data
Given$a$text$file$of$many$lines,$where$fields$within$a$line$
are$delineated$by$a$single$'dollar'$character,$write$a$program
that$aligns$each$column$of$fields$by$ensuring$that$words$in$each$
column$are$separated$by$at$least$one$space.
Further,$allow$for$each$word$in$a$column$to$be$either$left$
justified,$right$justified,$or$center$justified$within$its$column.
 
</syntaxhighlight>
 
=={{header|Elixir}}==
Line 3,278 ⟶ 3,375:
The String module of Elixir doesn't have the function of the center position adjusting.
It calls and processes the function of 'Erlang'.
<langsyntaxhighlight lang="elixir">defmodule Align do
def columns(text, alignment) do
fieldsbyrow = String.split(text, "\n", trim: true)
Line 3,312 ⟶ 3,409:
IO.puts "\n# #{alignment} Column-aligned output:"
Align.columns(text, alignment)
end)</langsyntaxhighlight>
 
{{out}}
Line 3,342 ⟶ 3,439:
 
=={{header|Erlang}}==
<langsyntaxhighlight lang="erlang">
-module (align_columns).
Line 3,380 ⟶ 3,477:
Zipped = lists:zip (All_words, Words_length),
[ apply(string, Alignment, [Word, Length + 1, $\s])
|| {Word, Length} <- Zipped]. </langsyntaxhighlight>
 
{{out}}
Line 3,413 ⟶ 3,510:
 
=={{header|Euphoria}}==
<langsyntaxhighlight lang="euphoria">constant data = {
"Given$a$text$file$of$many$lines,$where$fields$within$a$line$",
"are$delineated$by$a$single$'dollar'$character,$write$a$program",
Line 3,473 ⟶ 3,570:
end for
puts(1,'\n')
end for</langsyntaxhighlight>
 
{{out}}
Line 3,500 ⟶ 3,597:
 
=={{header|F_Sharp|F#}}==
<langsyntaxhighlight lang="fsharp">open System
open System.IO
 
Line 3,532 ⟶ 3,629:
format table align
printfn "%s" (new String('-', (Array.sum width) + width.Length - 1))
0</langsyntaxhighlight>
Output, when called with a file containing the sample input
<pre>Given a text file of many lines, where fields within a line
Line 3,557 ⟶ 3,654:
 
=={{header|Factor}}==
<langsyntaxhighlight lang="factor">USING: fry io kernel math math.functions math.order sequences
splitting strings ;
IN: rosetta.column-aligner
Line 3,596 ⟶ 3,693:
: print-aligned ( text alignment -- )
[ split-and-pad flip ] dip align-columns flip
[ [ write " " write ] each nl ] each ;</langsyntaxhighlight>
 
example-text { +left+ +middle+ +right+ } [ print-aligned ] with each
Line 3,602 ⟶ 3,699:
=={{header|FBSL}}==
Using a multiline string:
<langsyntaxhighlight lang="qbasic">#APPTYPE CONSOLE
 
DIM s = "Given$a$text$file$of$many$lines,$where$fields$within$a$line$
Line 3,636 ⟶ 3,733:
NEXT
 
PAUSE</langsyntaxhighlight>
{{out}}
Given a text file of many lines, where fields within a line
Line 3,649 ⟶ 3,746:
=={{header|Forth}}==
{{works with|GNU Forth}}
<langsyntaxhighlight lang="forth">\ align columns
 
: split ( addr len char -- addr len1 addr len-len1 )
Line 3,718 ⟶ 3,815:
\ cleanup
nip free throw
column-widths free throw</langsyntaxhighlight>
 
=={{header|Fortran}}==
Line 3,736 ⟶ 3,833:
 
Given a FORMAT text that produces output in aligned columns makes it easy enough to meet the other requirements. To cause texts to be aligned left, append sufficient spaces to each output text, and for centred text, half that number. This relies on the special intrinsic function REPEAT(text,n) returning a varying number of characters - CHARACTER functions have to return a ''fixed'' number of characters, until the standardisation of varying-length strings in F2003 ''et seq''. Earlier Fortrans lack the REPEAT function, but its effect can be gained via something like CHARACTER*66 SPACE, where SPACE is set to spaces, and SPACE(1:N) is used where REPEAT(" ",N) is desired. And if messing with variable FORMAT is unwanted, the REPEAT scheme can be used for the right-justified output also.
<syntaxhighlight lang="fortran">
<lang Fortran>
SUBROUTINE RAKE(IN,M,X,WAY) !Casts forth text in fixed-width columns.
Collates column widths so that each column is wide enough for its widest member.
Line 3,831 ⟶ 3,928:
CALL RAKE(IN,M,"$",+1) !Align right.
END !That's all.
</syntaxhighlight>
</lang>
Every line of output starts with a space, and if it were to be sent to a lineprinter, this would be used as the carriage control character (meaning, advance one line then print the rest) - the first column does not need to be set off by one space from the previous column, but rather than devise special treatment it is spaced off anyway. The free-format output statements also start with a space. Output:
<pre>
Line 3,865 ⟶ 3,962:
 
=={{header|FreeBASIC}}==
<langsyntaxhighlight lang="freebasic">' FB 1.05.0 Win64
 
Sub Split(s As String, sep As String, result() As String)
Line 3,962 ⟶ 4,059:
Next i
 
Close #1 : Close #2 : Close #3</langsyntaxhighlight>
 
{{out}}
Line 4,000 ⟶ 4,097:
Further, allow for each word in a column to be either left
justified, right justified, or center justified within its column.
</pre>
 
 
=={{header|FutureBasic}}==
Note: FB's NSLog, used for demonstrations, does not have a center alignment provision. However FB allows advanced alignment and text formatting in normal application development. Simple right and left alignment are shown here.
<syntaxhighlight lang="futurebasic">
include "NSLog.incl"
 
local fn AlignColumn
NSUInteger i
CFStringRef testStr = @"Given$a$text$file$of$many$lines,$where$fields$within$a$line$are$delineated$by¬
$a$single$'dollar'$character,$write$a$program$that$aligns$each$column$of$fields$by$ensuring$that$words¬
$in$each$column$are$separated$by$at$least$one$space.$Further,$allow$for$each$word$in$a$column$to$be¬
$either$left$justified$right$justified,$or$center$justified$within$its$column."
CFArrayRef temp = fn StringComponentsSeparatedByString( testStr, @"$" )
CFMutableArrayRef arr = fn MutableArrayWithArray( temp )
NSUInteger count = fn ArrayCount( arr )
ptr a(50)
NSLog( @"\nLeft aligned:\n" )
NSUInteger lineCheck = 1
for i = 0 to count -1
a( lineCheck ) = (ptr)fn StringUTF8String( arr[i] )
if ( lineCheck == 9 )
NSLog( @"%-12s %-11s %-12s %-11s %-12s %-12s %-12s %-12s %-12s", a(1),a(2),a(3),a(4),a(5),a(6),a(7),a(8),a(9) )
lineCheck = 1
else
lineCheck++
end if
next
NSLog( @"\n\nRight aligned:\n" )
lineCheck = 1
for i = 0 to count -1
a( lineCheck ) = (ptr)fn StringUTF8String( arr[i] )
if ( lineCheck == 9 )
NSLog( @"%12s %11s %12s %11s %12s %12s %12s %12s %12s", a(1),a(2),a(3),a(4),a(5),a(6),a(7),a(8),a(9) )
lineCheck = 1
else
lineCheck++
end if
next
end fn
 
fn AlignColumn
 
HandleEvents
</syntaxhighlight>
{{output}}
<pre>
 
Left aligned:
 
Given a text file of many lines, where fields
within a line are delineated by a single 'dollar'
character, write a program that aligns each column of
fields by ensuring that words in each column are
separated by at least one space. Further, allow for
each word in a column to be either left
justified right justified, or center justified within its column.
 
 
Right aligned:
 
Given a text file of many lines, where fields
within a line are delineated by a single 'dollar'
character, write a program that aligns each column of
fields by ensuring that words in each column are
separated by at least one space. Further, allow for
each word in a column to be either left
justified right justified, or center justified within its column.
</pre>
 
=={{header|Gambas}}==
'''[https://gambas-playground.proko.eu/?gist=023b4c5144d45e047abe02ebf5c4525a Click this link to run this code]'''
<langsyntaxhighlight lang="gambas">Public Sub Main() 'Written in Gambas 3.9.2 as a Command line Application - 15/03/2017
Dim siCount, siCounter, siLength As Short 'Counters
Dim siLongest As Short = -1 'To store the longest 'Word'
Line 4,047 ⟶ 4,219:
Next
 
End</langsyntaxhighlight>
 
{{out}}
Line 4,074 ⟶ 4,246:
 
=={{header|Go}}==
<langsyntaxhighlight lang="go">package main
 
import (
Line 4,134 ⟶ 4,306:
f.print(middle)
f.print(right)
}</langsyntaxhighlight>
<pre>
Given a text file of many lines, where fields within a line
Line 4,160 ⟶ 4,332:
=={{header|Groovy}}==
Solution:
<langsyntaxhighlight lang="groovy">def alignColumns = { align, rawText ->
def lines = rawText.tokenize('\n')
def words = lines.collect { it.tokenize(/\$/) }
Line 4,173 ⟶ 4,345:
 
words.each { padAll(justify[align], columnWidths, it).each { print it }; println() }
}</langsyntaxhighlight>
 
Test Program:
<langsyntaxhighlight lang="groovy">def rawTextInput = '''Given$a$text$file$of$many$lines,$where$fields$within$a$line$
are$delineated$by$a$single$'dollar'$character,$write$a$program
that$aligns$each$column$of$fields$by$ensuring$that$words$in$each$
Line 4,187 ⟶ 4,359:
alignColumns(align, rawTextInput)
println()
}</langsyntaxhighlight>
 
{{out}}
Line 4,216 ⟶ 4,388:
=={{header|Harbour}}==
 
<langsyntaxhighlight lang="visualfoxpro">
PROCEDURE Main()
LOCAL a := { "Given$a$text$file$of$many$lines,$where$fields$within$a$line$",;
Line 4,257 ⟶ 4,429:
RETURN
</syntaxhighlight>
</lang>
Output:
<langsyntaxhighlight lang="text">----Left aligned columns----
Given a text file of many lines, where fields within a line
are delineated by a single 'dollar' character, write a program
Line 4,281 ⟶ 4,453:
column are separated by at least one space.
Further, allow for each word in a column to be either left
justified, right justified, or center justified within its column.</langsyntaxhighlight>
 
=={{header|Haskell}}==
<langsyntaxhighlight lang="haskell">import Data.List (unfoldr, transpose)
import Control.Arrow (second)
 
Line 4,309 ⟶ 4,481:
where
dl = cw - length w
(l, r) = (dl `div` 2, dl - l)</langsyntaxhighlight>
{{out}}
<pre>
Line 4,323 ⟶ 4,495:
Or, using '''Text''' and its functions as an alternative to '''[Char]''' strings:
 
<langsyntaxhighlight lang="haskell">import Prelude as P
import Data.Text as T
(Text, pack, unpack, splitOn, unlines, unwords, length,
Line 4,357 ⟶ 4,529:
(zip cols ((T.length . maximumBy (comparing T.length)) <$> cols))
] <*>
[justifyLeft, justifyRight, center]</langsyntaxhighlight>
{{Out}}
<pre>Given a text file of many lines, where fields within a line
Line 4,382 ⟶ 4,554:
=={{header|HicEst}}==
A file opened with a Format option describing the column format(s) can be addressed like a standard in-memory array. In addition the DLG function ([http://www.HicEst.com/MatrixExplorer.htm MatrixExplorer]) allows this text/numeric file to be edited or visualized in many ways, but string columns are always left adjusted while numeric columns are right adjusted. Export is possible.
<syntaxhighlight lang="hicest">
<lang HicEst>
CHARACTER Fnam = "\HicEst\Rosetta\Align columns.txt"
 
Line 4,409 ⟶ 4,581:
WRITE() out
ENDDO
END</langsyntaxhighlight>
<pre>Given a text file of many lines, where fields within a line
are delineated by a single 'dollar' character, write a program
Line 4,432 ⟶ 4,604:
An argument of <tt>left</tt>, <tt>center</tt>, or <tt>right</tt> controls the
column alignment. The default is left-alignment.
<langsyntaxhighlight lang="icon">global width
 
procedure main(args)
Line 4,461 ⟶ 4,633:
write()
}
end</langsyntaxhighlight>
 
Sample run:
Line 4,480 ⟶ 4,652:
 
'''Solution'''
<langsyntaxhighlight lang="j">'LEFT CENTER RIGHT'=: i.3 NB. justification constants
NB.* alignCols v Format delimited text in justified columns
Line 4,497 ⟶ 4,669:
7 17 global oldbox NB. restore settings
result
)</langsyntaxhighlight>
 
'''Example''':
<langsyntaxhighlight lang="j"> text=: noun define
Given$a$text$file$of$many$lines,$where$fields$within$a$line$
are$delineated$by$a$single$'dollar'$character,$write$a$program
Line 4,523 ⟶ 4,695:
column are separated by at least one space.
Further, allow for each word in a column to be either left
justified, right justified, or center justified within its column.</langsyntaxhighlight>
 
=={{header|Java}}==
Line 4,530 ⟶ 4,702:
{{libheader|Apache Commons Lang}}
 
<langsyntaxhighlight Javalang="java">import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
Line 4,673 ⟶ 4,845:
}
}
}</langsyntaxhighlight>
 
=={{header|JavaScript}}==
Line 4,679 ⟶ 4,851:
===Imperative===
 
<syntaxhighlight lang="javascript">
<lang JavaScript>
var justification="center",
input=["Given$a$text$file$of$many$lines,$where$fields$within$a$line$",
Line 4,710 ⟶ 4,882:
for(x=0;x<input.length;x++) input[x]=input[x].join(" ");
input=input.join("\n");
document.write(input);</langsyntaxhighlight>
 
===Functional===
 
<langsyntaxhighlight JavaScriptlang="javascript">//break up each string by '$'. The assumption is that the user wants the trailing $.
var data = [
"Given$a$text$file$of$many$lines,$where$fields$within$a$line$",
Line 4,761 ⟶ 4,933:
 
return zip(formattedCols).map(function (row) { return row.join(' '); }).join('\n');
};</langsyntaxhighlight>
 
 
Line 4,767 ⟶ 4,939:
Or (ES5) using transpose and zipWith:
 
<langsyntaxhighlight JavaScriptlang="javascript">(function (strText) {
'use strict';
Line 4,899 ⟶ 5,071:
Further,$allow$for$each$word$in$a$column$to$be$either$left$\n\
justified,$right$justified,$or$center$justified$within$its$column."
);</langsyntaxhighlight>
 
{{Out}}
Line 4,927 ⟶ 5,099:
{{ Works with|jq|1.4}}
The key to the following implementation is the filter named "transpose", which is defined to work on a possibly jagged matrix. It is provided as a built-in in jq 1.5 and later.
<langsyntaxhighlight lang="jq"># transpose a possibly jagged matrix
def transpose:
if . == [] then []
Line 4,969 ⟶ 5,141:
(""; . + ($line[$i]|justify($widths[$i])) ))
| join("\n")
;</langsyntaxhighlight>
'''Example''':
<langsyntaxhighlight lang="jq">"Center:", format("center"), "",
"Left:", format("left"), "",
"Right:", format("right")</langsyntaxhighlight>
{{Out}}
<div style="overflow:scroll; height:200px;"><langsyntaxhighlight lang="sh">$ jq -M -R -r -s -f Align_columns.jq Align_columns.txt
Center:
Given a text file of many lines, where fields within a line
Line 4,999 ⟶ 5,171:
Further, allow for each word in a column to be either left
justified, right justified, or center justified within its column.
</langsyntaxhighlight></div>
 
=={{header|Jsish}}==
From Javascript ES5 entry.
<langsyntaxhighlight lang="javascript">/* Align columns, in Jsish */
function alignColumns(phrases:array, just:string) {
var x, y, max, diff, left, right, cols=0;
Line 5,044 ⟶ 5,216:
puts(alignColumns(trial, just), '\n');
}
}</langsyntaxhighlight>
 
{{out}}
Line 5,074 ⟶ 5,246:
=={{header|Julia}}==
{{trans|Python}}
<langsyntaxhighlight lang="julia">txt = """Given\$a\$txt\$file\$of\$many\$lines,\$where\$fields\$within\$a\$line\$
are\$delineated\$by\$a\$single\$'dollar'\$character,\$write\$a\$program
that\$aligns\$each\$column\$of\$fields\$by\$ensuring\$that\$words\$in\$each\$
Line 5,113 ⟶ 5,285:
end
println("-"^sum(max_widths))
end</langsyntaxhighlight>
{{out}}
<pre>
Line 5,143 ⟶ 5,315:
 
=={{header|Kotlin}}==
<langsyntaxhighlight lang="scala">import java.nio.charset.StandardCharsets
import java.nio.file.Files
import java.nio.file.Paths
Line 5,205 ⟶ 5,377:
else -> System.err.println("Error! Unknown alignment: " + alignment)
}
}</langsyntaxhighlight>
 
=={{header|Lambdatalk}}==
Line 5,211 ⟶ 5,383:
The input data is a sequence of characters where words are supposed to be separated by $ and lines be ended by \$. A HTML table is used to format the output left, centered or right justified.
 
<langsyntaxhighlight lang="scheme">
{def txt
Given$a$text$file$of$many$lines,$where$fields$within$a$line\$are$delineated$by$a$single$'dollar'$character,$write$a$program\$that$aligns$each$column$of$fields$by$ensuring$that$words$in$each\$column$are$separated$by$at$least$one$space.\$Further,$allow$for$each$word$in$a$column$to$be$either$left\$justified,$right$justified,$or$center$justified$within$its$column.}
Line 5,250 ⟶ 5,422:
 
{columns center txt} and {columns right txt} outputs can be seen in this website: http://lambdaway.free.fr/lambdawalks/?view=align_columns
</syntaxhighlight>
</lang>
 
=={{header|Lasso}}==
<langsyntaxhighlight Lassolang="lasso">#!/usr/bin/lasso9
 
local(text = "Given$a$text$file$of$many$lines,$where$fields$within$a$line$
Line 5,319 ⟶ 5,491:
}
 
prepcols(#text)</langsyntaxhighlight>
 
{{out}}
Line 5,350 ⟶ 5,522:
 
=={{header|Liberty BASIC}}==
<langsyntaxhighlight lang="lb">mainwin 140 32
 
CRLF$ =chr$( 13)
Line 5,427 ⟶ 5,599:
end function
 
end</langsyntaxhighlight>
 
=={{header|Lua}}==
{{works with|Lua|5.1}}
 
<langsyntaxhighlight lang="lua">
local tWord = {} -- word table
local tColLen = {} -- maximum word length in a column
Line 5,493 ⟶ 5,665:
return output
end--alignColumn
</syntaxhighlight>
</lang>
 
Usage Example:
 
<langsyntaxhighlight lang="lua">
input =
[[Given$a$text$file$of$many$lines,$where$fields$within$a$line$
Line 5,510 ⟶ 5,682:
outputRight = alignColumn(input, "right")
alignColumn(input, "center", "output.txt")
</syntaxhighlight>
</lang>
 
=={{header|M2000 Interpreter}}==
<syntaxhighlight lang="m2000 interpreter">
<lang M2000 Interpreter>
Module Align_Columns {
a$={Given$a$text$file$of$many$lines,$where$fields$within$a$line$
Line 5,566 ⟶ 5,738:
}
Align_Columns
</syntaxhighlight>
</lang>
 
{{out}}
Line 5,592 ⟶ 5,764:
=={{header|Maple}}==
Assign the sample data.
<syntaxhighlight lang="maple">
<lang Maple>
txt :=
"Given$a$text$file$of$many$lines,$where$fields$within$a$line$\n"
Line 5,600 ⟶ 5,772:
"Further,$allow$for$each$word$in$a$column$to$be$either$left$\n"
"justified,$right$justified,$or$center$justified$within$its$column.\n":
</syntaxhighlight>
</lang>
The following procedure solves the problem. It takes the string to be operated on as input, and an optional alignment parameter, which defaults to centred alignment. The aligned text is returned, as a string, which can then be printed.
<syntaxhighlight lang="maple">
<lang Maple>
AlignColumns := proc( txt, align :: { "left", "right", "centre" } := "centre" )
uses StringTools;
Line 5,627 ⟶ 5,799:
Join( J, "\n" )
end proc:
</syntaxhighlight>
</lang>
For the sample text, we get the following results.
<syntaxhighlight lang="maple">
<lang Maple>
> printf( "%s\n", AlignColumns( txt ) ):
Given a text file of many lines, where fields within a line
Line 5,658 ⟶ 5,830:
Further, allow for each word in a column to be either left
justified, right justified, or center justified within its column.
</syntaxhighlight>
</lang>
Alternatively, this could be printed to a file (using fprintf instead of printf).
 
=={{header|Mathematica}} / {{header|Wolfram Language}}==
<langsyntaxhighlight Mathematicalang="mathematica">TableForm[StringSplit[StringSplit[a,"\n"],"$"],TableAlignments -> Center]</langsyntaxhighlight>
Output with example text :
[[File:centeredtext.png]]
Line 5,668 ⟶ 5,840:
=={{header|MATLAB}} / {{header|Octave}}==
center-justified formatting is not implemented here
<syntaxhighlight lang="matlab">
<lang Matlab>
function r = align_columns(f)
fid = fopen('align_column_data.txt', 'r');
Line 5,698 ⟶ 5,870:
end
end;
</syntaxhighlight>
</lang>
 
 
Line 5,718 ⟶ 5,890:
Further, allow for each word in a column to be either left
justified, right justified, or center justified within its column.
</pre>
 
=={{header|MiniScript}}==
<syntaxhighlight lang="miniscript">
Alignment = {"left": -1, "center": 0, "right": 1}
 
Align = {}
Align.load = function(contents)
self.lines = contents.split(char(13))
self.rows = []
self.numColumns = 0
for line in self.lines
columns = line.split("$")
if columns.len > self.numColumns then self.numColumns = columns.len
self.rows.push(columns)
end for
self.widths = []
for col in range(0, self.numColumns - 1)
maxWidth = 0
for line in self.rows
if col > line.len - 1 then continue
if line[col].len > maxWidth then maxWidth = line[col].len
end for
self.widths.push(maxWidth)
end for
end function
 
Align.__getField = function(word, width, alignment)
if alignment == Alignment.left then return (word + " " * width)[:width]
if alignment == Alignment.right then return (" " * width+word)[-width:]
if alignment == Alignment.center then
leftMargin = floor((width - word.len) / 2)
return (" " * leftMargin + word + " " * width)[:width]
end if
end function
 
Align.output = function(alignment)
for line in self.rows
for c in range(0, line.len - 1)
print self.__getField(line[c], self.widths[c], alignment) + " ", ""
end for
print
end for
end function
 
txt = "Given$a$text$file$of$many$lines,$where$fields$within$a$line$" + char(13)
txt += "are$delineated$by$a$single$'dollar'$character,$write$a$program" + char(13)
txt += "that$aligns$each$column$of$fields$by$ensuring$that$words$in$each$" + char(13)
txt += "column$are$separated$by$at$least$one$space." + char(13)
txt += "Further,$allow$for$each$word$in$a$column$to$be$either$left$" + char(13)
txt += "justified,$right$justified,$or$center$justified$within$its$column."
 
Align.load(txt)
print "Left alignment:"
Align.output(Alignment.left)
print
print "Right alignment:"
Align.output(Alignment.right)
print
print "Centered: "
Align.output(Alignment.center)
</syntaxhighlight>
 
 
{{out}}
<pre>
>miniscript.exe align-columns.ms
Left alignment:
Given a text file of many lines, where fields within a line
are delineated by a single 'dollar' character, write a program
that aligns each column of fields by ensuring that words in each
column are separated by at least one space.
Further, allow for each word in a column to be either left
justified, right justified, or center justified within its column.
 
Right alignment:
Given a text file of many lines, where fields within a line
are delineated by a single 'dollar' character, write a program
that aligns each column of fields by ensuring that words in each
column are separated by at least one space.
Further, allow for each word in a column to be either left
justified, right justified, or center justified within its column.
 
Centered:
Given a text file of many lines, where fields within a line
are delineated by a single 'dollar' character, write a program
that aligns each column of fields by ensuring that words in each
column are separated by at least one space.
Further, allow for each word in a column to be either left
justified, right justified, or center justified within its column.
</pre>
 
Line 5,724 ⟶ 5,987:
Note the presetting of P102 to indicate the alignment required.
 
<langsyntaxhighlight MLlang="ml/Ii">MCSKIP "WITH" NL
"" Align columns - assumes macros on input stream 1, data on stream 2
MCPVAR 102
Line 5,780 ⟶ 6,043:
>
MCSET S1=1
*MCSET S10=102</langsyntaxhighlight>
 
=={{header|ML/I}}==
Line 5,786 ⟶ 6,049:
Note the presetting of P102 to indicate the alignment required.
 
<langsyntaxhighlight MLlang="ml/Ii">MCSKIP "WITH" NL
"" Align columns - assumes macros on input stream 1, data on stream 2
MCPVAR 102
Line 5,842 ⟶ 6,105:
>
MCSET S1=1
*MCSET S10=102</langsyntaxhighlight>
 
=={{header|MUMPS}}==
<langsyntaxhighlight MUMPSlang="mumps">columns(how) ; how = "Left", "Center" or "Right"
New col,half,ii,max,spaces,word
Set ii=0
Line 5,897 ⟶ 6,160:
column are separated by at least one space.
Further, allow for each word in a column to be either left
justified, right justified, or center justified within its column.</langsyntaxhighlight>
 
=={{header|Nim}}==
<langsyntaxhighlight lang="nim">from strutils import splitLines, split
from sequtils import mapIt
from strfmt import format, write
Line 5,924 ⟶ 6,187:
stdout.write(w.format align & $maxs[j])
stdout.write "\n"
stdout.write "\n"</langsyntaxhighlight>
{{out}}
<pre>Left column-aligned output:
Line 5,954 ⟶ 6,217:
Source: [https://github.com/nitlang/nit/blob/master/examples/rosettacode/align_columns.nit the official Nit’s repository]
 
<langsyntaxhighlight lang="nit"># Task: Align columns
#
# Uses `Text::justify` from the standard library.
Line 6,002 ⟶ 6,265:
aligner(text, 0.0)
aligner(text, 1.0)
aligner(text, 0.5)</langsyntaxhighlight>
{{out}}
<pre>Given a text file of many lines, where fields within a line
Line 6,026 ⟶ 6,289:
=={{header|Oberon-2}}==
works with oo2c version 2.
<langsyntaxhighlight lang="oberon2">
MODULE Columns;
IMPORT
Line 6,135 ⟶ 6,398:
END Columns.
 
</syntaxhighlight>
</lang>
<pre>
Given a text file of many lines, where fields within a line
Line 6,162 ⟶ 6,425:
 
=={{header|OCaml}}==
<langsyntaxhighlight lang="ocaml">#load "str.cma"
open Str
 
Line 6,215 ⟶ 6,478:
let sp2 = String.make pad2 ' ' in
Printf.printf "%s%s%s " sp1 word sp2);
;;</langsyntaxhighlight>
 
=={{header|Oforth}}==
 
<langsyntaxhighlight lang="oforth">import: mapping
import: file
 
Line 6,239 ⟶ 6,502:
0 #[ apply( #[ size max ] ) ] lines apply ->maxsize
#[ apply( #[ justify( maxsize , just) . ] ) printcr ] lines apply
;</langsyntaxhighlight>
 
{{out}}
Line 6,255 ⟶ 6,518:
 
=={{header|ooRexx}}==
<syntaxhighlight lang="oorexx">
<lang ooRexx>
text = .array~of("Given$a$text$file$of$many$lines,$where$fields$within$a$line$", -
"are$delineated$by$a$single$'dollar'$character,$write$a$program", -
Line 6,330 ⟶ 6,593:
say out~string
end
</syntaxhighlight>
</lang>
<pre>
align left:
Line 6,361 ⟶ 6,624:
 
=={{header|OpenEdge/Progress}}==
<langsyntaxhighlight lang="progress">FUNCTION alignColumns RETURNS CHAR (
i_c AS CHAR,
i_calign AS CHAR
Line 6,420 ⟶ 6,683:
alignColumns( cc, "right" ) SKIP
alignColumns( cc, "center" )
VIEW-AS ALERT-BOX.</langsyntaxhighlight>
 
{{out}}
Line 6,585 ⟶ 6,848:
 
=={{header|Oz}}==
<langsyntaxhighlight lang="oz">declare
%% Lines: list of strings
%% Alignment: function like fun {Left Txt ExtraSpace} ... end
Line 6,659 ⟶ 6,922:
"justified,$right$justified,$or$center$justified$within$its$column."]
in
{ForAll {Align Lines Left} System.showInfo}</langsyntaxhighlight>
 
=={{header|Pascal}}==
See [[Align_columns#Delphi | Delphi]]
modified to {{works with|Free Pascal}}
<langsyntaxhighlight lang="pascal">program Project1;
 
{$H+}//Use ansistrings
Line 6,737 ⟶ 7,000:
AlignByColumn(taCenter);
AlignByColumn(taRightJustify);
end.</langsyntaxhighlight>
{{out}}
<pre>
Line 6,763 ⟶ 7,026:
 
=={{header|Perl}}==
<langsyntaxhighlight Perllang="perl">#/usr/bin/perl -w
use strict ;
 
Line 6,818 ⟶ 7,081:
}
print "\n" ;
}</langsyntaxhighlight>
a shorter solution
<langsyntaxhighlight lang="perl">use List::Util qw(max);
 
sub columns {
Line 6,843 ⟶ 7,106:
Further,$allow$for$each$word$in$a$column$to$be$either$left$
justified,$right$justified,$or$center$justified$within$its$column.
END</langsyntaxhighlight>
 
=={{header|Phix}}==
<!--<langsyntaxhighlight Phixlang="phix">-->
<span style="color: #008080;">constant</span> <span style="color: #000000;">data</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span>
<span style="color: #008000;">"Given$a$text$file$of$many$lines,$where$fields$within$a$line$"</span><span style="color: #0000FF;">,</span>
Line 6,914 ⟶ 7,177:
<span style="color: #000000;">AlignColumns</span><span style="color: #0000FF;">()</span>
<!--</langsyntaxhighlight>-->
{{out}}
<pre>
Line 6,940 ⟶ 7,203:
 
=={{header|Phixmonti}}==
<langsyntaxhighlight Phixmontilang="phixmonti">include ..\Utilitys.pmt
 
0 40 repeat var gap
Line 6,985 ⟶ 7,248:
0 alignWords nl
1 alignWords nl
drop</langsyntaxhighlight>
 
=={{header|PHP}}==
<langsyntaxhighlight lang="php"><?php
$j2justtype = array('L' => STR_PAD_RIGHT,
'R' => STR_PAD_LEFT,
Line 7,034 ⟶ 7,297:
echo aligner($textinfile, $j);
 
?></langsyntaxhighlight>
 
=={{header|Picat}}==
<syntaxhighlight lang="picat">import util.
 
main =>
Text =
"Given$a$text$file$of$many$lines,$where$fields$within$a$line$
are$delineated$by$a$single$'dollar'$character,$write$a$program
that$aligns$each$column$of$fields$by$ensuring$that$words$in$each$
column$are$separated$by$at$least$one$space.
Further,$allow$for$each$word$in$a$column$to$be$either$left$
justified,$right$justified,$or$center$justified$within$its$column.",
Lines = split(Text,"\n"),
Lines = [Line1|_],
N = len(split(strip(Line1,"$ "), "$")), % number of columns
WidthArr = {0 : _ in 1..N},
foreach (Line in Lines)
Words = split(strip(Line,"$ "), "$"),
foreach ({I,Word} in zip(1..N, Words))
WidthArr[I] := max(WidthArr[I], len(Word))
end
end,
foreach (I in 1..N)
WidthArr[I] := WidthArr[I]+1 % separate cols by at least one space
end,
foreach (Align in [left, right, center])
output_lines(Lines,N,WidthArr,Align),
nl,nl
end.
 
output_lines(Lines,N,WidthArr,Align) =>
foreach (Line in Lines)
Words = split(strip(Line,"$ "), "$"),
foreach ({I,Word} in zip(1..N, Words))
output_word(Word,WidthArr[I],Align)
end,
nl
end.
 
output_word(Word,Width,left) =>
printf("%-*s",Width,Word).
output_word(Word,Width,right) =>
printf("%*s",Width,Word).
output_word(Word,Width,_) =>
Pad = len(Word)-Width,
Pad1 is Pad div 2,
Pad2 is Pad-Pad1,
printf("%*s%s%*s",Pad1,"",Word,Pad2,"").
</syntaxhighlight>
{{out}}
<pre>
Given a text file of many lines, where fields within a line
are delineated by a single 'dollar' character, write a program
that aligns each column of fields by ensuring that words in each
column are separated by at least one space.
Further, allow for each word in a column to be either left
justified, right justified, or center justified within its column.
 
 
Given a text file of many lines, where fields within a line
are delineated by a single 'dollar' character, write a program
that aligns each column of fields by ensuring that words in each
column are separated by at least one space.
Further, allow for each word in a column to be either left
justified, right justified, or center justified within its column.
 
 
Given a text file of many lines, where fields within a line
are delineated by a single 'dollar' character, write a program
that aligns each column of fields by ensuring that words in each
column are separated by at least one space.
Further, allow for each word in a column to be either left
justified, right justified, or center justified within its column.
</pre>
 
=={{header|PicoLisp}}==
<langsyntaxhighlight PicoLisplang="picolisp">(let Sizes NIL # Build a list of sizes
(let Lines # and of lines
(make
Line 7,057 ⟶ 7,394:
(prinl)
(for L Lines
(prinl (apply center L Sizes)) ) ) ) # and centered</langsyntaxhighlight>
{{out}}
<pre>Given a text file of many lines, where fields within a line
Line 7,081 ⟶ 7,418:
 
=={{header|PL/I}}==
<syntaxhighlight lang="pl/i">
<lang PL/I>
declare text character (300) varying;
declare word character (20) varying;
Line 7,119 ⟶ 7,456:
put file (output) skip;
end;
</syntaxhighlight>
</lang>
 
=={{header|PowerShell}}==
<syntaxhighlight lang="powershell">
<lang PowerShell>
$file =
@'
Line 7,145 ⟶ 7,482:
}
$arr | Format-Table -HideTableHeaders -Wrap *
</syntaxhighlight>
</lang>
<b>Output:</b>
<pre>
Line 7,158 ⟶ 7,495:
=={{header|Prolog}}==
Works with SWI-Prolog.
<langsyntaxhighlight Prologlang="prolog">aligner :-
L ="Given$a$text$file$of$many$lines,$where$fields$within$a$line$
are$delineated$by$a$single$'dollar'$character,$write$a$program
Line 7,237 ⟶ 7,574:
{N2 is N1 + 1},
parse_word(T, N2, NF, TF).
</syntaxhighlight>
</lang>
 
{{out}}
Line 7,269 ⟶ 7,606:
=={{header|PureBasic}}==
{{works with|PureBasic|4.41}}
<langsyntaxhighlight PureBasiclang="purebasic">Declare max(a,b)
 
If OpenConsole()
Line 7,343 ⟶ 7,680:
Data.s "Further,$allow$for$each$word$in$a$column$oo$be$either$left$"
Data.s "justified,$right$justified,$or$center$justified$within$its$column."
EndDataSection</langsyntaxhighlight>
 
=={{header|Python}}==
===Procedural===
====Using f-strings====
<langsyntaxhighlight lang="python">from itertools import zip_longest
 
txt = """Given$a$txt$file$of$many$lines,$where$fields$within$a$line$
Line 7,367 ⟶ 7,704:
print(' '.join(f"{wrd:{j}{wdth}}" for wdth, wrd in zip(widths, line)))
print("- " * 52)
</syntaxhighlight>
</lang>
 
{{out}}
Line 7,399 ⟶ 7,736:
 
====Using StringIO====
<langsyntaxhighlight lang="python">from StringIO import StringIO
textinfile = '''Given$a$text$file$of$many$lines,$where$fields$within$a$line$
Line 7,443 ⟶ 7,780:
infile = StringIO(textinfile)
print "\n# %s Column-aligned output:" % align
print aligner(infile, align[0])</langsyntaxhighlight>
 
{{out}}
Line 7,474 ⟶ 7,811:
Works with Python 2 and 3.
 
<langsyntaxhighlight lang="python">'''
cat <<'EOF' > align_columns.dat
Given$a$text$file$of$many$lines,$where$fields$within$a$line$
Line 7,491 ⟶ 7,828:
for row in rows:
print(' '.join(fmts).format(*(row + [''] * len(fmts))))
print('')</langsyntaxhighlight>
 
 
====Alternative====
{{trans|D}}
<langsyntaxhighlight lang="python">txt = """Given$a$txt$file$of$many$lines,$where$fields$within$a$line$
are$delineated$by$a$single$'dollar'$character,$write$a$program
that$aligns$each$column$of$fields$by$ensuring$that$words$in$each$
Line 7,516 ⟶ 7,853:
print(justify(word, max_widths[j]), end=' ')
print()
print("- " * 52)</langsyntaxhighlight>
 
===Functional===
Line 7,524 ⟶ 7,861:
(Selection of string justification methods via '''getattr'''):
{{Works with|Python|3.7}}
<langsyntaxhighlight lang="python">'''Variously aligned columns
from delimited text.
'''
Line 7,598 ⟶ 7,935:
# MAIN ---
if __name__ == '__main__':
main()</langsyntaxhighlight>
{{Out}}
<pre>Given a text file of many lines, where fields within a line
Line 7,622 ⟶ 7,959:
 
=={{header|q}}==
<langsyntaxhighlight lang="q">text:(
"Given$a$text$file$of$many$lines,$where$fields$within$a$line$";
"are$delineated$by$a$single$'dollar'$character,$write$a$program";
Line 7,635 ⟶ 7,972:
ps:$[aln=`R;-1-cw;1+cw]$''s; / padded strings
ps:$[aln=`C;(neg(cw-sl)div 2)rotate''ps;ps]; / center
1,[;"\n\n"]"\n"sv raze each ps; } / print</langsyntaxhighlight>
{{out}}
<pre>q)ta[`L]text
Line 7,663 ⟶ 8,000:
 
=={{header|R}}==
<langsyntaxhighlight Rlang="r"># Read in text
lines <- readLines(tc <- textConnection("Given$a$text$file$of$many$lines,$where$fields$within$a$line$
are$delineated$by$a$single$'dollar'$character,$write$a$program
Line 7,687 ⟶ 8,024:
print0(leftjust)
print0(rightjust)
print0(centrejust)</langsyntaxhighlight>
Right justified output shown.
<div style="width:full;overflow:scroll"><pre>
Line 7,699 ⟶ 8,036:
 
=={{header|Racket}}==
<syntaxhighlight lang="racket">
<lang Racket>
#lang racket
 
Line 7,734 ⟶ 8,071:
(display-aligned #:justify 'right text)
(display-aligned #:justify 'center text)
</syntaxhighlight>
</lang>
 
=={{header|Raku}}==
Line 7,742 ⟶ 8,079:
Call with parameter left (default), center or right.
 
<syntaxhighlight lang="raku" perl6line>my @lines =
q|Given$a$text$file$of$many$lines,$where$fields$within$a$line$
are$delineated$by$a$single$'dollar'$character,$write$a$program
Line 7,764 ⟶ 8,101:
default { $word ~ " " x $lr }
}
}</langsyntaxhighlight>
 
Or a more functional version, called like <code>./align.p6 left input.txt</code>, which however only supports left and right alignment (not center):
 
<syntaxhighlight lang="raku" perl6line>sub MAIN ($alignment where 'left'|'right', $file) {
my @lines := $file.IO.lines.map(*.split('$').cache).cache;
my @widths = roundrobin(|@lines).map(*».chars.max);
Line 7,774 ⟶ 8,111:
my $format = @widths.map( '%' ~ ++$ ~ '$' ~ $align ~ * ~ 's' ).join(' ') ~ "\n";
printf $format, |$_ for @lines;
}</langsyntaxhighlight>
 
=={{header|RapidQ}}==
<syntaxhighlight lang="vb">
<lang vb>
Dim MText as QMemorystream
MText.WriteLine "Given$a$text$file$of$many$lines,$where$fields$within$a$line$"
Line 7,819 ⟶ 8,156:
TextCenter = TextCenter + Newline
next
</syntaxhighlight>
</lang>
{{out}}
<pre style="height:20ex;overflow:scroll">TextLeft contains:
Line 7,847 ⟶ 8,184:
 
=={{header|REBOL}}==
<langsyntaxhighlight lang="rebol">REBOL [
Title: "Align Columns"
URL: http://rosettacode.org/wiki/Align_columns
Line 7,904 ⟶ 8,241:
foreach i [left centre right] [
print ["^/Align" i "...^/"] entable data get i]
</syntaxhighlight>
</lang>
 
{{out}}
Line 7,936 ⟶ 8,273:
 
=={{header|Red}}==
<langsyntaxhighlight Redlang="red">Red [
Title: "Align Columns"
Original-Author: oofoe
Line 7,994 ⟶ 8,331:
 
foreach i [left centre right] [
print [newline "Align" i "..." newline] entable data get i]</langsyntaxhighlight>
 
=={{header|REXX}}==
===(no output)===
<langsyntaxhighlight lang="rexx">/*REXX*/
z.1 = "Given$a$text$file$of$many$lines,$where$fields$within$a$line$"
z.2 = "are$delineated$by$a$single$'dollar'$character,$write$a$program"
Line 8,046 ⟶ 8,383:
end
say out
end</langsyntaxhighlight>
 
===(with output)===
<langsyntaxhighlight lang="rexx">/*REXX program displays various alignments for words in an array of text strings. */
size= 0; t.=; cols= 0; wid.= 0; @.= /*zero or nullify some variables. */
t.1 = "Given$a$text$file$of$many$lines,$where$fields$within$a$line$"
Line 8,078 ⟶ 8,415:
say substr(_, 2) /*ignore the leading extra blank. */
end /*r*/
end /*j*/ /*stick a fork in it, we're all done. */</langsyntaxhighlight>
{{out|output|text=&nbsp; when using the default input:}}
<pre>
Line 8,110 ⟶ 8,447:
===(boxed output)===
Note: &nbsp; this version boxes each column of output to better show the columns.
<langsyntaxhighlight lang="rexx">/*REXX program displays various alignments for words in an array of text strings. */
size= 0; t.=; cols= 0; wid.= 0; @.= /*zero or nullify some variables. */
t.1 = "Given$a$text$file$of$many$lines,$where$fields$within$a$line$"
Line 8,146 ⟶ 8,483:
end /*r*/ /* [↑] shows words in boxes. */
say translate(bot, '┴', "┬") /*display the bottom line of the box. */
end /*j*/ /*stick a fork in it, we're all done. */</langsyntaxhighlight>
{{out|output|text=&nbsp; when using the default input:}}
<pre>
Line 8,184 ⟶ 8,521:
=={{header|Ruby}}==
{{works with|Ruby|1.9.3+}}
<langsyntaxhighlight lang="ruby">J2justifier = {Left: :ljust, Right: :rjust, Center: :center}
 
=begin
Line 8,227 ⟶ 8,564:
puts aligner(infile, align)
end
</syntaxhighlight>
</lang>
 
{{out}}
Line 8,257 ⟶ 8,594:
 
=={{header|Run BASIC}}==
<langsyntaxhighlight Runbasiclang="runbasic">theString$ = "Given$a$text$file$of$many$lines,$where$fields$within$a$line$" _
+ "are$delineated$by$a$single$'dollar'$character,$write$a$program" _
+ "that$aligns$each$column$of$fields$by$ensuring$that$words$in$each$"_
Line 8,295 ⟶ 8,632:
wend
print
end function</langsyntaxhighlight>
{{out}}
<pre style="height:15ex;overflow:scroll">------------ align:left -- across:6 ------------
Line 8,335 ⟶ 8,672:
 
=={{header|Rust}}==
<langsyntaxhighlight lang="rust">use std::iter::{repeat, Extend};
 
enum AlignmentType {
Line 8,398 ⟶ 8,735:
println!("{}", repeat('-').take(110).collect::<String>());
println!("{}", align_columns(text, AlignmentType::Right));
}</langsyntaxhighlight>
{{out}}
<pre style="height:15ex;overflow:scroll">
Line 8,430 ⟶ 8,767:
For Scala 2.7, change from fromPath to fromFile, and remove the extra parameter to Source's getLines.
 
<langsyntaxhighlight lang="scala">object ColumnAligner {
val eol = System.getProperty("line.separator")
def getLines(filename: String) = scala.io.Source.fromPath(filename).getLines(eol)
Line 8,457 ⟶ 8,794:
alignFile(filename, alignment) foreach println
}
}</langsyntaxhighlight>
 
Another take:
 
<langsyntaxhighlight lang="scala">def pad(s:String, i:Int, d:String) = {
val padsize = (i-s.length).max(0)
d match {
Line 8,482 ⟶ 8,819:
val padded = words map ( _.zipWithIndex.map{case(s,i)=>pad(s,maxlens(i),"center")+" "} )
padded map (_.reduceLeft(_ + _)) foreach println</langsyntaxhighlight>
 
=={{header|Scheme}}==
 
<langsyntaxhighlight lang="scheme">
(import (scheme base)
(scheme write)
Line 8,540 ⟶ 8,877:
(align-columns *example* 'center)
(align-columns *example* 'right)
</syntaxhighlight>
</lang>
 
{{out}}
Line 8,572 ⟶ 8,909:
=={{header|sed}}==
The code allows to left (by default) or right justify colums. Centering is not supported. Requires about 2x<size of input> bytes of memory (each line duplicated).
<langsyntaxhighlight lang="sed">
#!/bin/sed -nrf
# Format: <master-pattern>\n<line1>\n<line1-as-pattern>\n<line2>\n<line2-as-pattern>...
Line 8,648 ⟶ 8,985:
bnextline
}
</syntaxhighlight>
</lang>
Example:
<pre>
Line 8,668 ⟶ 9,005:
 
=={{header|Seed7}}==
<langsyntaxhighlight lang="seed7">$ include "seed7_05.s7i";
 
const array string: inputLines is [] (
Line 8,719 ⟶ 9,056:
writeln;
end for;
end func;</langsyntaxhighlight>
 
{{out}}
Line 8,730 ⟶ 9,067:
justified, right justified, or center justified within its column.
</pre>
 
=={{header|SETL}}==
<syntaxhighlight lang="setl">program align;
magic := false; $ turn off regexp matching in GNU SETL
read_file;
ncols := max/[#line : line in lines];
sizes := [1+max/[#(line(col) ? "") : line in lines] : col in [1..ncols]];
loop for line in lines do
print(+/[align(line(col), sizes(col)) : col in [1..#line]]);
end loop;
read_file::
f := open(command_line(1), "r");
lines := [];
loop doing geta(f, line); while line /= om do
lines with:= split(line, "$");
end loop;
close(f);
proc align(s, n);
case command_line(2) of
("r"): return lpad(s, n);
("l"): return rpad(s, n);
("c"): return center(s, n);
end case;
end proc;
proc center(s, n);
padding := n - #s;
l := " " * ceil(padding/2);
r := " " * floor(padding/2);
return l + s + r;
end proc;
end program;</syntaxhighlight>
{{out}}
<pre>$ setl align.setl test.txt l
Given a text file of many lines, where fields within a line
are delineated by a single 'dollar' character, write a program
that aligns each column of fields by ensuring that words in each
column are separated by at least one space.
Further, allow for each word in a column to be either left
justified, right justified, or center justified within its column.
$ setl align.setl test.txt r
Given a text file of many lines, where fields within a line
are delineated by a single 'dollar' character, write a program
that aligns each column of fields by ensuring that words in each
column are separated by at least one space.
Further, allow for each word in a column to be either left
justified, right justified, or center justified within its column.
$ setl align.setl test.txt c
Given a text file of many lines, where fields within a line
are delineated by a single 'dollar' character, write a program
that aligns each column of fields by ensuring that words in each
column are separated by at least one space.
Further, allow for each word in a column to be either left
justified, right justified, or center justified within its column.</pre>
 
=={{header|Shiny}}==
<langsyntaxhighlight lang="shiny">text: 'Given$a$text$file$of$many$lines,$where$fields$within$a$line$
are$delineated$by$a$single$\'dollar\'$character,$write$a$program
that$aligns$each$column$of$fields$by$ensuring$that$words$in$each$
Line 8,770 ⟶ 9,165:
align text 'left'
align text 'center'
align text 'right'</langsyntaxhighlight>
 
<pre>Given a text file of many lines, where fields within a line
Line 8,794 ⟶ 9,189:
 
=={{header|Sidef}}==
<langsyntaxhighlight lang="ruby">class Format(text, width) {
method align(j) {
text.map { |row|
Line 8,840 ⟶ 9,235:
say f.align(left);
say f.align(middle);
say f.align(right);</langsyntaxhighlight>
 
=={{Header|Smalltalk}}==
the following works with Smalltalk/X, but should also in other dialects (may have to add "centerPadded" to the String class).
{{works with |Smalltalk/X }}
<langsyntaxhighlight lang="smalltalk">text :=
'Given$a$text$file$of$many$lines,$where$fields$within$a$line$
are$delineated$by$a$single$''dollar''$character,$write$a$program
Line 8,914 ⟶ 9,309:
 
Stdout cr; printCR:'Centered with box:'.
printCentered value:text value:true.</langsyntaxhighlight>
{{out}}
<pre>Left justified:
Line 8,987 ⟶ 9,382:
=={{header|Snobol}}==
{{works with|Snobol|4}}
<langsyntaxhighlight lang="snobol">* Since we don't know how much text we'll be reading in,
* we store the words and field widths in tables
Words = TABLE()
Line 9,079 ⟶ 9,474:
 
END
</syntaxhighlight>
</lang>
 
{{Out}}
Line 9,106 ⟶ 9,501:
Further, allow for each word in a column to be either left
justified, right justified, or center justified within its column.</pre>
 
=={{header|SparForte}}==
As a structured script.
<syntaxhighlight lang="ada">#!/usr/local/bin/spar
 
pragma annotate( summary, "aligncols" )
@( description, "Given a text file of many lines, where fields within a line are delineated ")
@( description, "by a single 'dollar' character, write a program that aligns each column of" )
@( description, "fields by ensuring that words in each column are separated by at least one" )
@( description, "space. Further, allow for each word in a column to be either left justified," )
@( description, "right justified, or center justified within its column. " )
@( description, "A modified version of the Ada solution from Rosetta Code" )
@( category, "tutorials" )
@( author, "Ken O. Burtch" )
@( see_also, "http://rosettacode.org/wiki/Align_columns" );
pragma license( unrestricted );
 
pragma software_model( nonstandard );
pragma restriction( no_external_commands );
 
procedure aligncols is
Text : constant string :=
"Given$a$text$file$of$many$lines,$where$fields$within$a$line$" & ASCII.NUL &
"are$delineated$by$a$single$'dollar'$character,$write$a$program" & ASCII.NUL &
"that$aligns$each$column$of$fields$by$ensuring$that$words$in$each$" & ASCII.NUL &
"column$are$separated$by$at$least$one$space." & ASCII.NUL &
"Further,$allow$for$each$word$in$a$column$to$be$either$left$" & ASCII.NUL &
"justified,$right$justified,$or$center$justified$within$its$column." & ASCII.NUL;
File : file_type;
Width : array(1..1000) of natural;
ch : character;
Column : positive := 1;
Start : positive := 1;
type Alignment is ( Left, Center, Right );
s : string;
padding : natural;
begin
-- Zero Widths
for I in arrays.first( Width )..arrays.last( Width ) loop
Width(I) := 0;
end loop;
-- Determining the widths of columns
for I in 1..strings.length(Text) loop
ch := strings.element( Text, I );
case ch is
when '$' | ASCII.NUL =>
Width (Column) := numerics.max(Width (Column), I - Start + 1);
Start := I + 1;
if strings.element( Text, I ) = ASCII.NUL then
Column := 1;
else
Column := @+1;
end if;
when others =>
null;
end case;
end loop;
create( File, out_file, "columned.txt" );
-- Formatting
for Align in Left..Right loop
Column := 1;
Start := 1;
for I in 1..strings.length(Text) loop
ch := strings.element( Text, I );
case ch is
when '$' | ASCII.NUL =>
s := strings.slice( Text, Start, I-1 );
padding := (Width( Column ) - strings.length(s));
case Align is
when Left =>
s := @ & (padding * ' ');
when Center =>
declare
left_padding : constant natural := padding/2;
right_padding : constant natural := padding - left_padding;
begin
s := (left_padding * ' ') & @ & (right_padding * ' ');
end;
when Right =>
s := (padding * ' ') & @;
when others =>
null;
end case;
put( File, s );
Start := I+1;
if ch = ASCII.NUL then
new_line( File );
Column := 1;
else
Column := @+1;
end if;
when others =>
null;
end case;
end loop;
new_line( File );
end loop;
close( File );
end aligncols;</syntaxhighlight>
 
=={{header|Standard ML}}==
<langsyntaxhighlight lang="sml">fun curry f x y = f (x, y)
fun uncurry f (x, y) = f x y
 
Line 9,136 ⟶ 9,630:
(* test stdin with all alignments *)
val () = print (String.concatWith "\n\n"
(map (formatTable (readTable TextIO.stdIn)) [alignL, alignC, alignR]) ^ "\n")</langsyntaxhighlight>
{{out}}
<pre>Given a text file of many lines, where fields within a line
Line 9,164 ⟶ 9,658:
{{trans|Rust}}
 
<langsyntaxhighlight lang="swift">import Foundation
 
extension String {
Line 9,249 ⟶ 9,743:
print(alignCols(input: input, align: .center))
print()
print(alignCols(input: input, align: .right))</langsyntaxhighlight>
 
{{out}}
Line 9,277 ⟶ 9,771:
 
=={{header|Tcl}}==
<langsyntaxhighlight lang="tcl">package require Tcl 8.5
 
set text {Given$a$text$file$of$many$lines,$where$fields$within$a$line$
Line 9,324 ⟶ 9,818:
}
puts ""
}</langsyntaxhighlight>
{{out}}
<pre>Given a text file of many lines, where fields within a line
Line 9,350 ⟶ 9,844:
Transd has built-in support for "left" and "right" formatting, but not "centered", which added quite a bit of code.
 
<langsyntaxhighlight lang="scheme">#lang transd
 
MainModule : {
Line 9,392 ⟶ 9,886:
(lout "") (print true)
)
}</langsyntaxhighlight>{{out}}
<pre>
Given a text file of many lines, where fields within a line
Line 9,417 ⟶ 9,911:
 
=={{header|TSE SAL}}==
<syntaxhighlight lang="tsesal">
<lang TSESAL>
INTEGER PROC FNBlockChangeColumnAlignLeftB( INTEGER columnTotalI, INTEGER spaceTotalI, INTEGER buffer1I )
INTEGER B = FALSE
Line 9,551 ⟶ 10,045:
GotoBufferId( bufferI )
END
</syntaxhighlight>
</lang>
{{out}} <pre>
Given a text file of many lines, where fields within a line
Line 9,562 ⟶ 10,056:
 
=={{header|TUSCRIPT}}==
<langsyntaxhighlight lang="tuscript">
$$ MODE TUSCRIPT
MODE DATA
Line 9,585 ⟶ 10,079:
ENDLOOP
SET exampletext=JOIN(new1,"$",new2,new3,new4,new5,new6,new7,new8,new9,new10,new11,new12)
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 9,599 ⟶ 10,093:
=={{header|TXR}}==
 
<langsyntaxhighlight lang="txr">@(collect)
@ (coll)@{item /[^$]+/}@(end)
@(end)
Line 9,625 ⟶ 10,119:
@{pi @(- [cw i] (trunc (- [cw i] (length pi)) 2))} @(end)
@ (end)
@(end)</langsyntaxhighlight>
 
<pre>$ txr align-columns.txr align-columns.dat
Line 9,649 ⟶ 10,143:
=={{header|UNIX Shell}}==
This is a draft implementation of the "align columns" problem using Unix shell commands. The key tool for left and right justified text is the "rs" command. Centered text is a little more complex, since this is not a feature currently in "rs" (''The centered solution will be added later.'')
<langsyntaxhighlight lang="bash">
cat <<EOF_OUTER > just-nocenter.sh
#!/bin/sh
Line 9,687 ⟶ 10,181:
exit
EOF_OUTER
</syntaxhighlight>
</lang>
{{out}}
<syntaxhighlight lang="sh">
<lang sh>
$ ./just-nocenter.sh
Given a text file of many lines, where fields within a line
Line 9,704 ⟶ 10,198:
Further, allow for each word in a column to be either left
justified, right justified, or center justified within its column.
</syntaxhighlight>
</lang>
 
The centered output will be added later, when I've more time. '' I did this in about 10 minutes.''
Line 9,711 ⟶ 10,205:
Note that the left-justified case can be handled trivially by the <tt>column</tt> command, which ships with modern Linux and macOS systems:
 
<langsyntaxhighlight lang="sh">tr '$' ' ' | column -t</langsyntaxhighlight>
 
{{Out}}
Line 9,728 ⟶ 10,222:
For right justification, each word's string of trailing blanks is moved to the beginning,
and for center justification, the trailing blanks are divided equally between the beginning and end of each word.
<langsyntaxhighlight Ursalalang="ursala">#import std
 
text =
Line 9,747 ⟶ 10,241:
#show+
 
main = mat0 <.just_left,just_center,just_right> text</langsyntaxhighlight>
{{out}}
<pre style="height:17ex;overflow:scroll">
Line 9,776 ⟶ 10,270:
Both arguments are optional and default to "left" and 1 respectively.
 
<syntaxhighlight lang="vb">
<lang vb>
Public Sub TestSplit(Optional align As String = "left", Optional spacing As Integer = 1)
Dim word() As String
Line 9,842 ⟶ 10,336:
Next l
End Sub
</syntaxhighlight>
</lang>
 
{{out}}
Line 9,866 ⟶ 10,360:
=={{header|VBScript}}==
{{trans|Rexx}}
<langsyntaxhighlight lang="vb">' Align columns - RC - VBScript
Const nr=16, nc=16
ReDim d(nc),t(nr), wor(nr,nc)
Line 9,928 ⟶ 10,422:
xRTrim = cc
End Function 'xRTrim
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 9,958 ⟶ 10,452:
=={{header|Vedit macro language}}==
This implementation converts the file currently being edited. The file can then be saved with different filename if required.
<langsyntaxhighlight lang="vedit">RS(10, "$") // Field separator
#11 = 1 // Align: 1 = left, 2 = center, 3 = right
 
Line 9,997 ⟶ 10,491:
}
Line(1, ERRBREAK)
}</langsyntaxhighlight>
 
{{out}}
Line 10,025 ⟶ 10,519:
 
=={{header|Visual Basic}}==
<langsyntaxhighlight lang="vb">Sub AlignCols(Lines, Optional Align As AlignmentConstants, Optional Sep$ = "$", Optional Sp% = 1)
Dim i&, j&, D&, L&, R&: ReDim W(UBound(Lines)): ReDim C&(0)
Line 10,040 ⟶ 10,534:
Debug.Print Space(L); W(j)(i); Space(R); IIf(i < UBound(W(j)), "", vbLf);
Next i, j
End Sub</langsyntaxhighlight>
Usage:<langsyntaxhighlight lang="vb">Sub Main() 'usage of the above
Const Text$ = "Given$a$text$file$of$many$lines,$where$fields$within$a$line$" & vbLf & _
"are$delineated$by$a$single$'dollar'$character,$write$a$program" & vbLf & _
Line 10,052 ⟶ 10,546:
Debug.Print vbLf; "-- Center:": AlignCols Split(Text, vbLf), vbCenter
Debug.Print vbLf; "-- Right:": AlignCols Split(Text, vbLf), vbRightJustify
End Sub</langsyntaxhighlight>
{{out}}
<pre>-- Left:
Line 10,079 ⟶ 10,573:
 
=={{header|Visual Basic .NET}}==
<langsyntaxhighlight lang="vb">Module Module1
Private Delegate Function Justification(s As String, width As Integer) As String
 
Line 10,143 ⟶ 10,637:
End Sub
 
End Module</langsyntaxhighlight>
 
{{out}}
Line 10,170 ⟶ 10,664:
justified, right justified, or center justified within its column.</pre>
 
=={{header|V (Vlang)}}==
Currently (5/2022) vlangV (Vlang) uses string interpolation so `$` have to be escaped. Variables in formatting aren't currently allowed, and if they were only right/left are currently valid options
<syntaxhighlight lang="v (vlang)">
const text = "Given\$a\$text\$file\$of\$many\$lines,\$where\$fields\$within\$a\$line\$
are\$delineated\$by\$a\$single\$'dollar'\$character,\$write\$a\$program
Line 10,240 ⟶ 10,734:
f.print(Justify.middle)
f.print(Justify.right)
}</langsyntaxhighlight>
 
{{out}}
Line 10,268 ⟶ 10,762:
=={{header|Wren}}==
{{libheader|Wren-fmt}}
<langsyntaxhighlight ecmascriptlang="wren">import "io" for File
import "./fmt" for Fmt
 
var LEFT = 0
Line 10,321 ⟶ 10,815:
var fileName = "align_cols.txt"
var lines = getLines.call(fileName)
for (i in 0..2) alignCols.call(lines, i)</langsyntaxhighlight>
 
{{out}}
Line 10,349 ⟶ 10,843:
justified, right justified, or center justified within its column.
</pre>
 
=={{header|XPL0}}==
<syntaxhighlight lang "XPL0">
 
string 0;
def LF=$0A, CR=$0D;
def Left, Right, Center;
 
proc AlignCols(S); \Display string S with its columns aligned
char S, C, Field(80), ColWidth(80);
int I, J, N, Just;
 
proc Justify;
int T;
 
proc SpOut(M); \Output M space characters
int M, K;
for K:= 0 to M-1 do ChOut(0, ^ );
 
proc FieldOut; \Output Field of N characters
int K;
for K:= 0 to N-1 do ChOut(0, Field(K));
 
[case Just of
Left: [FieldOut(N); SpOut(ColWidth(J)-N+1)];
Right: [SpOut(ColWidth(J)-N+1); FieldOut(N)];
Center:[T:= ColWidth(J)-N+1;
SpOut(T/2); FieldOut(N); SpOut(T/2 + rem(0))]
other [];
];
 
[\Get width (in characters) of each column
for J:= 0 to 80-1 do ColWidth(J):= 0;
I:= 0; J:= 0; N:= 0;
loop [repeat C:= S(I); I:= I+1 until C # CR;
if N > ColWidth(J) then ColWidth(J):= N;
case C of
0: quit;
^$: [N:= 0; J:= J+1];
LF: [N:= 0; J:= J+1; J:= 0]
other N:= N+1;
];
for Just:= Left to Center do
[I:= 0; J:= 0; N:= 0;
loop [repeat C:= S(I); I:= I+1 until C # CR;
case C of
0: [Justify(Just); CrLf(0); quit];
^$: [Justify(Just); N:= 0; J:= J+1];
LF: [Justify(Just); CrLf(0); N:= 0; J:= 0]
other [Field(N):= C; N:= N+1];
];
CrLf(0);
];
];
 
AlignCols("Given$a$text$file$of$many$lines,$where$fields$within$a$line$
are$delineated$by$a$single$'dollar'$character,$write$a$program
that$aligns$each$column$of$fields$by$ensuring$that$words$in$each$
column$are$separated$by$at$least$one$space.
Further,$allow$for$each$word$in$a$column$to$be$either$left$
justified,$right$justified,$or$center$justified$within$its$column.")
</syntaxhighlight>
{{out}}
<pre>
Given a text file of many lines, where fields within a line
are delineated by a single 'dollar' character, write a program
that aligns each column of fields by ensuring that words in each
column are separated by at least one space.
Further, allow for each word in a column to be either left
justified, right justified, or center justified within its column.
 
Given a text file of many lines, where fields within a line
are delineated by a single 'dollar' character, write a program
that aligns each column of fields by ensuring that words in each
column are separated by at least one space.
Further, allow for each word in a column to be either left
justified, right justified, or center justified within its column.
 
Given a text file of many lines, where fields within a line
are delineated by a single 'dollar' character, write a program
that aligns each column of fields by ensuring that words in each
column are separated by at least one space.
Further, allow for each word in a column to be either left
justified, right justified, or center justified within its column.
</pre>
 
=={{header|Yabasic}}==
{{trans|Run BASIC}}
<syntaxhighlight lang="yabasic">theString$ = "Given$a$text$file$of$many$lines,$where$fields$within$a$line$"
theString$ = theString$ + "are$delineated$by$a$single$'dollar'$character,$write$a$program"
theString$ = theString$ + "that$aligns$each$column$of$fields$by$ensuring$that$words$in$each$"
theString$ = theString$ + "column$are$separated$by$at$least$one$space."
theString$ = theString$ + "Further,$allow$for$each$word$in$a$column$to$be$either$left$"
theString$ = theString$ + "justified,$right$justified,$or$center$justified$within$its$column."
x = shoTable(theString$, "left", 6)
x = shoTable(theString$, "right", 6)
x = shoTable(theString$, "center", 6)
end
 
sub word$(sr$, wn, delim$)
local i, j, n, sd, sl, sl2
local s$, res$, d$
d$ = delim$
j = wn
if j = 0 j = j+1
res$ = "" : s$ = sr$
if d$ = "" d$ = " "
sd = len(d$) : sl = len(s$)
do
n = instr(s$,d$)
j = j - 1
if j = 0 then
if n = 0 then res$ = s$ else res$ = mid$(s$, 1, n-1) : fi
return res$
fi
if n = 0 return res$
if n = sl-sd then res$ = "" : return res$ : fi
sl2 = sl-n
s$ = mid$(s$, n+1, sl2)
sl = sl2
loop
return res$
end sub
 
sub shoTable(theString$, align$, across)
local i, a$, b$
 
print "------------ align:", align$, " -- across:", across, " ------------"
dim siz(across)
b$ = " "
while word$(theString$, i+1, "$") <> ""
siz(mod(i, across)) = max(siz(mod(i, across)), len(word$(theString$, i+1, "$")))
i = i+1
wend
for i = 0 to across - 1
siz(i) = siz(i)+1
if siz(i) and 1 siz(i) = siz(i)+1
next i
i = 0
a$ = word$(theString$, i+1, "$")
while a$ <> ""
s = siz(mod(i, across)) - len(a$)
if align$ = "right" a$ = left$(b$, s) + a$
if align$ = "left" a$ = a$ + left$(b$, s)
if align$ = "center" a$ = left$(b$, int(s / 2)) + a$ + left$(b$, int(s / 2) + (s and 1))
print "|", a$;
i = i + 1
if mod(i, across) = 0 print "|"
a$ = word$(theString$, i+1, "$")
wend
print
end sub</syntaxhighlight>
{{out}}
<pre>Same as Run BASIC entry.</pre>
 
=={{header|zkl}}==
<langsyntaxhighlight lang="zkl">fcn format(text,how){
words:=text.split("$").apply("split").flatten();
max:=words.reduce(fcn(p,n){ n=n.len(); n>p and n or p },0);
Line 10,366 ⟶ 11,017:
do{ w.pump(wordsPerCol,d,fmt).append("\n") } while(not w.atEnd);
d.text;
}</langsyntaxhighlight>
<langsyntaxhighlight lang="zkl">text:=
"Given$a$text$file$of$many$lines,$where$fields$within$a$line$\n"
"are$delineated$by$a$single$'dollar'$character,$write$a$program\n"
Line 10,377 ⟶ 11,028:
format(text,-1).print();
format(text, 0).print();
format(text, 1).print();</langsyntaxhighlight>
Blow apart the text into a list of words, find max len of any word, calc how many words will fit on a 80 col line, format all words into a bit bucket line at a time. Formatting is "%-ms" or "%ms" for left & right justify (m is field width), calculated for center. fmt is the string format method or center calc function, depending. Where string formatting can be used, it would be better to format all words in a line in one go but the code would be longer.
{{out}}
Line 10,414 ⟶ 11,065:
=={{header|ZX Spectrum Basic}}==
The max width (without 'hack') of ZX Spectrum screen is 32 characters. The text sample is adapted for this feature.
<langsyntaxhighlight lang="zxbasic"> 5 BORDER 2
10 DATA 6
20 DATA "The$problem$of$Speccy$"
Line 10,460 ⟶ 11,111:
3090 NEXT i
3095 PRINT
3100 RETURN</langsyntaxhighlight>
 
{{out}}Left alignement example:
290

edits