CSV文件转TXT有没有辨法每一行列都对齐并支援UTF-8?

CSV文件转TXT有没有办法每一行列都对齐并支援UTF-8?
先谢谢各位大佬了。

Python

import csv

# 读取CSV文件并指定编码方式为latin-1
with open('input.csv', 'r', encoding='latin-1') as csv_file:
    csv_reader = csv.reader(csv_file)
    data = list(csv_reader)

# 确定每列最长的长度
max_lengths = [max(len(row[i]) for row in data) for i in range(len(data[0]))]

# 写入TXT文件并保持对齐
with open('output.txt', 'w', encoding='utf-8') as txt_file:
    for row in data:
        txt_file.write(' '.join(cell.ljust(max_lengths[i] + 2) for i, cell in enumerate(row)) + '\n')

小弟用上面这方法还是无法完整对齐。 :sob:


解决方法
使用Pixie大佬的工具
cmder
再执行
VIctoryRoad大佬的指令

cat 源文件.csv | column -t -s "," > 目标文件.txt

可以再配合小弟的批次
BAT

@echo off
cls

REM 提示用户输入 CSV 档案的完整路径
set /p csv_file=请输入CSV档案的完整路径(例如:C:\path\to\file.csv): 

REM 验证输入的 CSV 档案是否存在
if not exist "%csv_file%" (
    echo 错误:指定的档案不存在。
    pause
    exit /b
)

REM 获取 CSV 档案所在的目录路径
for %%F in ("%csv_file%") do (
    set "csv_dir=%%~dpF"
)

REM 提示用户输入输出的 TXT 档名
set /p txt_file=请输入输出的TXT档名(例如:output.txt): 

REM 构建输出的 TXT 档案的完整路径
set "txt_path=%csv_dir%%txt_file%"

REM 执行命令
type "%csv_file%" | column -t -s "," > "%txt_path%"

echo 操作已完成。结果已储存到 %txt_path%。
pause

就可以完成
CSV TO TXT 不对齐的问题
结果

1	         2         	   3
11        22       	   33
111	     222   	       333

如果各单元格中文本的长度相差不大,可以试试这个方法:

  1. 用 Excel 打开 csv 文件
  2. Ctrl + A 选中所有内容,然后按 Ctrl + C 复制
  3. 打开记事本(notepad),按Ctrl + V 粘贴
  4. 点击 文件→保存,保存 txt 文本文档,并将 “编码” 设置为 “UTF-8”

另外稍微提一下马新简体和中国大陆简体之间的区别:

大陆简体中,“辦”对应的简体字是“办”。而“辨”字读biàn,常取辨别、分辨之意。

“辨”和“办”都有异体字“辦”,但办、辨似乎不互通。

“支援”在大陆简体中的含义是给予帮助(give aid to someone)。如果您想表达 support/have the ability to achieve special function 这种含义,大陆简体字一般用“支持”。

1 个赞

你的对齐是什么意思?

2 个赞

应该是这种效果吧:

1	2	3
11	22	33
111	222	333

这里各列之间使用水平制表符进行分隔,水平制表符可以自动伸缩,以保证各列间距相同,如同一个无形的表格。但不同软件对水平制表符的支持情况不同,如果各列文本宽度相差太大,也可能无法对齐。

2 个赞

VSCode 的 Rainbow CSV 扩展有一个对齐特性: Align columns with spaces and Shrink (trim spaces from fields).

打开 csv 文件后:

  1. 点击状态栏的 Align 按钮即可对齐。
  2. 点击状态栏的编码按钮即可以 UTF-8 保存当前文件。

至于 .txt,只是一个扩展名,直接改就行了。(CSV 也是文本文件。)

4 个赞

VIctoryRoad
是的就如大佬所说

这小弟不会用 :sob:

是我冒昧了,告辞(拱手

抱歉,是小弟学的不精小白一个 :sob:

刚刚小弟使用PY

import csv
import chardet

def convert_csv_to_txt(input_file, output_file):
    # 使用chardet檢測檔案編碼
    with open(input_file, 'rb') as f:
        rawdata = f.read()
        encoding = chardet.detect(rawdata)['encoding']
    
    with open(input_file, 'r', encoding=encoding) as csv_file:
        csv_reader = csv.reader(csv_file)
        data = list(csv_reader)
    
    # 找到每個欄位的最大寬度
    max_lengths = [max(len(row[i]) for row in data) for i in range(len(data[0]))]
    
    with open(output_file, 'w', encoding=encoding) as txt_file:
        for row in data:
            # 構建每一列的格式化字串,使用固定寬度的空格對齊每一欄
            formatted_row = ' | '.join(cell.ljust(max_lengths[i]) for i, cell in enumerate(row))
            txt_file.write(formatted_row + '\n')

# 輸入檔案名稱
input_file = 'input.csv'
output_file = 'output.txt'

# 呼叫函式進行轉換
convert_csv_to_txt(input_file, output_file)

大致上用notepad++可以解决问题但还不是很完美 :joy:

import pandas as pd

# 读取CSV文件
df = pd.read_csv('yourfile.csv', encoding='latin-1')

# 将所有单元格内容转换为文本格式
df = df.astype(str)

# 计算每一列中的单元格内最长内容的长度(中文字符和中文标点记为2个字符长度,其他英文字符记为1个字符长度)
lengths = []
for col in df.columns:
    max_length = 0
    for index, row in df.iterrows():
        cell = row[col]
        length = sum(2 if ord(c) >= 0x4e00 and ord(c) <= 0x9fff else 1 for c in cell)
        if length > max_length:
            max_length = length
    lengths.append(max_length)

# 按照第二步的数据,将每个单元格的内容右对齐
formatted_df = df.copy()
for i, col in enumerate(formatted_df.columns):
    formatted_df[col] = formatted_df[col].apply(lambda x: x.rjust(lengths[i]))

# 将格式化后的数据写入out.txt文件
formatted_df.to_csv('out.txt', index=False, header=True)

手头没有电脑,用ai搓了一个,大体逻辑没问题,如果跑不了我晚上抽空改改再

问题如下
用python的pandas库帮我写一个程序,要求如下:
1,读取一个本地的csv文件作为df数据,文件编码为latin-1
2,将该数据库的所有单元格内容转换为文本格式
3,分别计算每一列中的单元格内最长内容的长度(注意,每个汉字及中文标点记为2个字符长度,其他英文字符记为1个字符长度)
3,按照第二步的数据,将每个单元格的内容右对齐
4,以csv的格式输出该文件为out.txt

举例:

a,b,c
中英文 空格124,test,qq

上面的csv将被格式化为

              a,   b, c
中英文 空格124,test,qq

另,为何不使用几乎万能的pandas呢

2 个赞

谢大佬大致上还不错是右排列 :+1:t2:

VSCode 是 Microsoft 家的编辑器,可以像浏览器一样安装扩展(Extensions)以实现更多功能。

和 Notepad++ 添加 Plugins 差不多意思。

1 个赞

你这有个大问题就是掺了中文的字符串无法对齐,理论上中文及其标点得按1字2长对应,还得用上等宽字体,不然显示还是不对

理论上是完全右排的,再理论上,还能设置居中和居左

此外,ai写的里面没有处理特殊字符如空格……还是不大完善

支持,很好用,可惜好像只能左对齐


还有个歪门邪道,通过tex文件:heavy_plus_sign:latexindent解决,但是有点太邪门了……你就当这个方案是图个乐子的吧

1 个赞

看了一下小白哭了,真看不懂到底是什么 :sob:

如果是 Linux 系统,有个最简单的方法:column 命令。执行如下命令即可:

cat 源文件.csv | column -t -s "," > 目标文件.txt

如果您的 Windows 系统安装了 WSL,或许可以试试这个方法。

您在使用的时候,只需将 “源文件.csv” 字段替换为您要读取的 csv 文件名称、“目标文件.txt” 字段替换为要输出的 txt 文件名称即可。即使您不了解 linux 命令行,只要执行上述命令,也可以得到想要的结果。

2 个赞

windows 不用安装 WSL 这么麻烦吧,下载个 git for windows 安装并添加到系统环境就可以用 cat 命令了
https://git-scm.com/

要想开箱即用的话,我建议下载个 cmder,它集成了 git,可以达到解压即用。请下载那个集成了的完全版,不要下那个 mini 版

2 个赞

核心不是 cat 命令,而是 column 命令,不知道这个在 git for windows 里面是否有提供。

刚刚下载了个 cmder 试了下,确实支持 column 命令,那楼主的问题完全可以交给 cmder 来解决了。

1 个赞

嗯,git 里有相当多 Linux 命令的 windows 版,是我等想用 Linux 命令又不想装 Linux 的救星 :smiley:

1 个赞

VIctoryRoad 大佬

Pixie 大佬

二位大佬完美解决问题,因为你们一个提供cmder,一个提供指令,小弟不知该给谁 “解决方式” :joy: