【问题标题】:Inserting filename into last column of csv file.将文件名插入 csv 文件的最后一列。
【发布时间】:2011-01-20 16:21:52
【问题描述】:

我想将 CSV 文件的文件名插入 CSV 文件的最后一列。

我找到了一个成功的 windows 批处理文件,但我正在寻找一个 linux bash 脚本。

我已经附上了windows批处理文件:

@echo off
setLocal EnableDelayedExpansion

for /f "tokens=* delims= " %%c in ('dir/b/a-d *.csv') do (
  set FN=%%~Nc
  set /a N=0

  for /f "tokens=* delims= " %%a in (%%c) do (
    set /a N+=1
    if !N! equ 1 (
      echo %%a, id > !FN!.csv
    ) else (
      echo %%a, !FN! >> !FN!.csv
    )
  )
)

期待解决这个问题。

亨利

【问题讨论】:

    标签: linux bash csv


    【解决方案1】:

    使用 (gnu)sed:

    for file in *.csv; do
        sed -i "s/$/,$file/" "$file"
    done
    

    使用 POSIX sed:

    for file in *.csv; do
        if sed "s/$/,$file/" "$file" > /tmp/"${file}".tmp; then
            mv /tmp/"${file}.tmp" "$file"
        fi
    done
    

    【讨论】:

    • gnu 种子工作,但将文件名添加到数据的第二列,覆盖原始数据。
    • POSIX 也是如此。然而,这两个脚本都添加了正确的数据,但添加到了错误的列。我们想要最后一列中的数据。我已经建立了数据。两者都在修改文件夹中的所有文件。
    • 第一个 $ 应该通过将 \ 放在它前面来进行转义。
    • @HenryLevine 如果您的 CSV 文件以 DOS 结尾,在它们上使用 unix sed 将在 \r 和 \n 之间插入新内容,这在终端上看起来很奇怪(后面的内容\r 与前面的文本写在输出的同一行,似乎覆盖了它)。在文件修复之前使用 dos2unix,或者在正则表达式中使用 \r$
    【解决方案2】:

    简单。

    import sys
    import glob
    
    for filename in glob.glob(sys.argv[1]):
        file = open(filename)
        data = [line.rstrip() + "," + filename for line in file]
        file.close()
    
        file = open(filename, "w")
        file.write("\n".join(data))
        file.close()
    

    另存为“csvadd.py”。然后此命令会将文件名添加到最后一列(当然替换 test.csv):

    python csvadd.py test.csv
    

    编辑

    更改了代码,它现在应该适用于操作系统支持的所有内容(通配符等)。它现在还将直接将更改写回文件。 谨慎使用

    【讨论】:

    • 谢谢。我可以使用通配符输入吗?哎呀。在该行的最后一列。
    • 再次测试。我使用了命令“python csvadd.py test.csv
    • 检查通配符。没运气。我应该提一下,我们必须每天处理 88 个文件。
    • 感谢它运行良好。我会想出一种使用通配符的方法。有任何想法吗?我正在考虑一个 bash 脚本。
    • 我用 *.csv 通配符检查了程序。它将文件名添加到第一个而不是其余部分。
    猜你喜欢
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    • 2013-08-21
    相关资源
    最近更新 更多