将 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

另一种完全不同的方法是将trtailhead 组合在一个命令中:

$ 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 文件的第一行更改为全部大写的主要内容,如果未能解决你的问题,请参考以下文章

如何从 CSV 文件中获取每一行的第一列?

如何在数据工厂中获取 CSV 的第一行和第一列值?

python: 怎样写一个函数把名字大写并变成下面这样?

如何更改 .csv 文件中一行的最后一个值

将 Web 表单中的 XML 响应更改为 CSV 文件

在python脚本中将excel文件更改为csv?