将 CSV 文件的第一行更改为全部大写
Posted
技术标签:
【中文标题】将 CSV 文件的第一行更改为全部大写【英文标题】:Change first line of CSV file to all uppercase 【发布时间】:2018-07-19 16:47:38 【问题描述】:我有一组 csv 文件,对于每个文件,第一行包含数据集的列名。一些 csv 文件的列名全部大写,而其他文件的列名全部小写。我的问题是如何更改每个 csv 文件,以便每个文件的第一行(也就是列名)在每列中显示为所有大写字符串?
我的尝试如下: 首先,我手动检查了所有文件,看看哪些文件的列名是大写和小写的,然后我运行了以下命令:
head -1 uppercase.csv > header.csv
#repeated all commands below for all lowercase files individually
sed -i 1d lowercase.csv
cat header.csv lowercase.csv > lowercase_new.csv
rm lowercase.csv
mv lowercase_new.csv lowercase.csv
我想知道是否有更自动化的方法来执行此操作,而无需手动检查每个文件。
示例:
Dataset1.csv
a b c
x x x
Dataset2.csv
A B C
y y y
如何使 Dataset1.csv 如下所示?
A B C
x x x
【问题讨论】:
Stack Overflow 是一个编程和开发问题的网站。这个问题似乎离题了,因为它与编程或开发无关。请参阅帮助中心的What topics can I ask about here。也许Super User 或Unix & Linux Stack Exchange 会是一个更好的提问地点。 谢谢。我将在 Unix 和 Linux Stack Exchange 上重新发布。由于很多人回答了这个问题,因此不想完全删除此帖子。 这里不是 OT,只是错过了您自己解决问题的尝试。 【参考方案1】:遵循简单的awk
也可能对您有所帮助。
awk 'NR==1$0=toupper($0) 1' Input_file
解释:
NR==1
: 在这里检查条件如果是第一行然后执行以下操作:
$0=toupper($0)
将当前行的值设为大写并保存。
1
awk
在条件方法和动作上起作用,所以我在这里将条件设置为 TRUE,在这里没有提及任何动作,因此默认情况下会打印当前行。
如果您想将输出保存到 Input_file 本身,则将以下内容附加到上述解决方案 > temp_file && mv temp_file Input_file
。 Input_file 是您要更改或传递给awk
的数据文件。
【讨论】:
终于 - 一个明智的答案! @EdMorton,感谢 Ed 先生,您让我过得愉快,先生 :)【参考方案2】:你可以用 sed 做到这一点:
$ sed -i -e '1 s/\(.*\)/\U\1/' input.csv
【讨论】:
【参考方案3】:明确指出,您的命令完全可以放入脚本并在一组文件上执行。
#!/bin/sh
head -n 1 uppercase.csv > header.csv
for lowercase; do
sed -i 1d "$lowercase"
cat header.csv "$lowercase" > "$lowercase"_new
rm "$lowercase"
mv "$lowercase"_new "$lowercase"
done
rm -f header.csv
将其保存为headerfix
,然后使用chmod +x ./headerfix
使其可执行,然后使用./headerfix lower1.csv lower2.csv lower3.csv
运行它以修复这三个文件中的标题。
一个正确的生产脚本会使用正确随机化的临时文件名(使用mktemp
),并且即使它被中断也要小心清除它们(使用trap
);我猜整个循环体可以重构为单个 sed
脚本(在这种情况下,不需要循环),但你已经有了很好的答案,可以优雅地做到这一点。
【讨论】:
感谢您的回答!我基本上是一个 linux n00b,所以我不知道你可以在 bash 中做这样的事情 其实它曾经是Borne shell的卖点之一。您可以在命令行上执行的任何操作都可以放入脚本中,反之亦然。您仍然可以看到旧样式,例如在 Windows 批处理脚本中,交互式 shell 中的某些部分语法不同(尽管我猜他们最终在 Powershell 中修复了该问题)。【参考方案4】:您也可以为此使用awk
:
$ awk 'NR==1 print toupper($0) NR>1' Dataset1.csv
说明:
对于第一行 (NR==1
) 会将整行 $0
更改为大写,然后对于文件的其余部分 (NR>1
) 将执行其默认操作,即打印该行。
现在如果你想生成一个文件,只需重定向stdout
$ awk 'NR==1 print toupper($0) NR>1' Dataset1.csv > new_file.csv
或者如果您想编辑初始文件,请执行以下操作:
$ awk 'NR==1 print toupper($0) NR>1' Dataset1.csv > tmp.csv && mv tmp.csv Dataset1.csv
另一种完全不同的方法是将tr
、tail
和head
组合在一个命令中:
$ cat toUpper.csv
a b c
x x x
y y y
z z z
$ (head -1 toUpper.csv | tr [[:lower:]] [[:upper:]] && tail -n +2 toUpper.csv ) > new_file.csv
$ cat new_file.csv
A B C
x x x
y y y
z z z
【讨论】:
感谢您的评论!我已经检查了手册和在线文档,你是对的!!!抱歉 -> 编辑我的帖子以上是关于将 CSV 文件的第一行更改为全部大写的主要内容,如果未能解决你的问题,请参考以下文章