golang文本对齐处理工具插件库align的使用

Golang文本对齐处理工具插件库align的使用

概述

align是一个通用的文本对齐工具,专注于提供快速、高效且实用的文本对齐功能。它的灵感来源于其他优秀的对齐工具,如Linux的column命令和Sublime Text的AlignTab插件。

功能特性

  • 提供简单实用的CLI工具,可指定分隔符、输入输出文件等
  • 支持任意字符串作为分隔符,不限于单个字符
  • 如果分隔符字符串包含在数据中,可以通过指定文本限定符进行转义
  • 支持每个字段的右对齐、居中对齐或左对齐

安装方法

$ go get github.com/Guitarbum722/align
$ make install

# 构建所有二进制文件
$ make release

使用示例

基本用法

# 指定输入文件和输出文件
$ align -f input_file.csv -o output_file.csv

# 使用标准输出
$ align -f input_file.csv -o 

# 通过管道输入
$ cat awesome.csv | align

处理不同字段数的行

$ echo "field1|field2\nValue1|Value2\nCoolValue1|CoolValue2|CoolValue3" | align -s \|
field1     | field2
Value1     | Value2
CoolValue1 | CoolValue2 | CoolValue3

列过滤和对齐方式覆盖

# 输出字段1,3,5,使用右对齐
$ cat file.csv | align -a right -c 1,3,5

# 输出字段1,2,3,7,8,默认左对齐,但字段7居中对齐
$ cat file.csv | align -c 1,2,3,7,8 -i 1:right,7:center

# 输出所有字段,默认右对齐,但覆盖特定列的对齐方式
$ cat file.csv | align -a right -i 1:center,5:left

国际字符支持

first          , last              , middle  , email
paul           , danny             ,  かど    , や製油

使用emoji作为分隔符

first  😮 last     😮 email
Hector 😮 Gonzalez 😮 h.g@nothing.com

添加额外填充

# 在分隔符周围添加4个空格的填充
align -p 4

完整Go代码示例

package main

import (
	"fmt"
	"github.com/Guitarbum722/align"
)

func main() {
	// 示例数据
	data := []string{
		"name,age,location",
		"John,30,New York",
		"Alice,25,San Francisco",
		"Bob,35,Chicago",
	}

	// 创建对齐器
	aligner := align.NewAlign(align.Left)
	aligner.SetDelimiter(",")
	aligner.SetPadding(2) // 设置2个空格的填充

	// 处理数据
	for _, line := range data {
		aligned, err := aligner.Align(line)
		if err != nil {
			fmt.Println("Error:", err)
			continue
		}
		fmt.Println(aligned)
	}
}

CLI选项说明

Usage: align [-h] [-f] [-o] [-q] [-s] [-d] [-a] [-c] [-i] [-p]
Options:
  -h | --help  帮助信息
  -f           输入文件。如果不指定,则从stdin读取
  -o           输出文件(默认为stdout)
  -q           文本限定符(如需要)
  -s           分隔符(默认为',')
  -d           输出分隔符(默认为-s的值)
  -a           <left>, <right>, <center> 对齐方式(默认为left)
  -c           输出特定字段(默认为所有字段)
  -i           按列号覆盖对齐方式(例如2:center,5:right)
  -p           分隔符周围的额外填充

贡献指南

如果您有任何建议或发现错误,请提交issue。如果您认为自己可以修复问题,请使用Fork/Pull Request方式提交您的功能分支。


更多关于golang文本对齐处理工具插件库align的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang文本对齐处理工具插件库align的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang 文本对齐处理工具 align 库使用指南

align 是一个简单实用的 Go 语言文本对齐处理库,可以帮助你对文本进行左对齐、右对齐、居中对齐等操作。下面我将详细介绍如何使用这个库。

安装

首先安装 align 库:

go get github.com/guptarohit/asciigraph

基本使用方法

1. 左对齐

package main

import (
	"fmt"
	"github.com/guptarohit/asciigraph/align"
)

func main() {
	text := "Hello, World!"
	width := 20
	
	// 左对齐
	leftAligned := align.Left(text, width)
	fmt.Printf("'%s'\n", leftAligned)
	
	// 输出: 'Hello, World!       '
}

2. 右对齐

func main() {
	text := "Hello, World!"
	width := 20
	
	// 右对齐
	rightAligned := align.Right(text, width)
	fmt.Printf("'%s'\n", rightAligned)
	
	// 输出: '       Hello, World!'
}

3. 居中对齐

func main() {
	text := "Hello, World!"
	width := 20
	
	// 居中对齐
	centerAligned := align.Center(text, width)
	fmt.Printf("'%s'\n", centerAligned)
	
	// 输出: '   Hello, World!    '
}

高级用法

多行文本对齐

func main() {
	lines := []string{
		"First line",
		"Second line is longer",
		"Third",
	}
	
	// 找出最长行的长度
	maxWidth := 0
	for _, line := range lines {
		if len(line) > maxWidth {
			maxWidth = len(line)
		}
	}
	
	// 对齐所有行
	fmt.Println("Left aligned:")
	for _, line := range lines {
		fmt.Printf("'%s'\n", align.Left(line, maxWidth))
	}
	
	fmt.Println("\nRight aligned:")
	for _, line := range lines {
		fmt.Printf("'%s'\n", align.Right(line, maxWidth))
	}
	
	fmt.Println("\nCenter aligned:")
	for _, line := range lines {
		fmt.Printf("'%s'\n", align.Center(line, maxWidth))
	}
}

表格数据对齐

func main() {
	data := [][]string{
		{"Name", "Age", "City"},
		{"John Doe", "30", "New York"},
		{"Jane Smith", "25", "London"},
		{"Bob Johnson", "45", "Paris"},
	}
	
	// 计算每列的最大宽度
	colWidths := make([]int, len(data[0]))
	for _, row := range data {
		for i, cell := range row {
			if len(cell) > colWidths[i] {
				colWidths[i] = len(cell)
			}
		}
	}
	
	// 打印对齐的表格
	for _, row := range data {
		for i, cell := range row {
			fmt.Printf("| %s ", align.Left(cell, colWidths[i]))
		}
		fmt.Println("|")
	}
}

自定义填充字符

默认情况下,align 使用空格进行填充,但你可以自定义填充字符:

func main() {
	text := "Hello"
	width := 10
	
	// 自定义左对齐,使用'-'填充
	left := align.Left(text, width)
	leftCustom := left[:len(text)] + strings.Repeat("-", width-len(text))
	fmt.Printf("'%s'\n", leftCustom)
	
	// 输出: 'Hello-----'
}

注意事项

  1. 如果文本长度大于指定的宽度,align 不会截断文本,而是原样返回
  2. 对于包含多字节字符的文本(如中文),需要使用 utf8.RuneCountInString 替代 len 来计算字符数
  3. 对齐操作不会处理换行符,多行文本需要先分割再分别对齐

性能考虑

对于大量文本处理,建议:

  1. 预先计算好最大宽度
  2. 批量处理文本而不是单行处理
  3. 如果需要处理非常大的文件,考虑流式处理

align 库虽然简单,但在处理文本对齐时非常实用,特别是生成报表、格式化输出等场景。

回到顶部