【问题标题】:Change numeric values in rows of CSV if string in same row has certain value如果同一行中的字符串具有特定值,则更改 CSV 行中的数值
【发布时间】:2021-10-10 09:08:02
【问题描述】:

我有一个 csv,如下所示,最多 15000 行
StartEnd 的数值介于 0 到 300 之间。
我正在寻找一种方法来解析文件,搜索以white 开头的行,然后使用以下条件检查该行的Start 值和End 值:

  1. 如果值≤150,则加150
  2. 如果值 > 150 则减去 150

最后,用编辑覆盖源文件。
我正在寻找一种使用 bash 或 python 来实现这一点的方法。 非常感谢任何帮助!

原始数据:

Color, Start, End
white, 0, 1, 
black, 23, 150, 
black, 150, 24, 
white, 24, 152, 
black, 152, 25, 
black, 25, 154, 
black, 154, 81, 
white, 99, 220,
...

最终数据:

Color, Start, End
white, 150, 151, 
black, 23, 150, 
black, 150, 24, 
white, 174, 2, 
black, 152, 25, 
black, 25, 154, 
black, 154, 81, 
white, 249, 70,
...

【问题讨论】:

  • 您好,欢迎来到 SO。你尝试了什么?结果如何?

标签: python pandas bash csv awk


【解决方案1】:

听起来对awk 来说是一份完美的工作:

awk -F, -v OFS=', ' '$1=="white" {for(i=2;i<=3;i++) if($i<=150) $i+=150; else $i-=150} 1' file.csv

【讨论】:

  • 效果很好!多谢!我在命令末尾添加了&gt; output.csv 以将结果写入文件
【解决方案2】:

执行此操作的 Python 代码:

注意:如果你运行它两次,所有值都会被重置,除了 0,它将是 300。

f = open("colors.csv", "r")
lines = f.read().split("\n")
f.close()
output = ""
for l in lines:
    parts = l.split(",")
    if len(parts) >= 3 and parts[0] == "white":
        if int(parts[1]) > 150:
            parts[1] = str(int(parts[1]) - 150)
        else:
            parts[1] = str(int(parts[1]) + 150)
        if int(parts[2]) > 150:
            parts[2] = str(int(parts[2]) - 150)
        else:
            parts[2] = str(int(parts[2]) + 150)
        output += (parts[0] + ", " + parts[1] + ", " + parts[2] + ",\n")
    else:
        output += (l + "\n")
f = open("colors.csv", "w")
f.write(output)
f.close()

【讨论】:

  • 如果有效,您应该将其标记为已接受的答案(或标记为 awk 答案,这样更优雅)。
【解决方案3】:
$ awk 'BEGIN{FS=" *, *"; OFS=", "; n=150} $1=="white"{ for (i=2; i<NF; i++) $i+=($i>n ? -n : n) } 1' file
Color, Start, End
white, 150, 151,
black, 23, 150,
black, 150, 24,
white, 174, 2,
black, 152, 25,
black, 25, 154,
black, 154, 81,
white, 249, 70,

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 2019-11-05
    • 1970-01-01
    • 2014-12-30
    • 2019-07-16
    • 2022-12-15
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    相关资源
    最近更新 更多