我有一个CSV文件,我正在写入另一个文件,但是在此过程中想要更改基于大于或小于的值。例如,在新文件的列中(旧文件中的第2行)我想将数据从数字转换为单词,具体取决于列中的值。我的实际数据有更多列,数千行,不超过10k行。示例如下:
Input.csv
duck,35,35
car,100,502
baseball,200,950
gun,500,495
taco,300,300
guitar,100,700
barbie, 200,25
gum,300,19
Desired Output.csv
duck,35,35,order now
car,100,502,order next month
baseball,200,950,no order necessary
gun,500,495,order next month
taco,300,300,order next month
guitar,100,700,order next month
barbie, 200,25,order urgent
gum,300,19,order urgent
到目前为止,这是我的代码,但我在将金额转换为新值时遇到问题。我想我需要使用枚举,但是在我使用这种方法进行csv转换的研究中没有找到任何例子。请协助。
import csv
with open('INTERIM RESULTS.CSV', 'r') as source:
rdr = csv.reader(source)
with open('INTERIM RESULTS FIXED.CSV', 'w', newline = '') as result:
wtr = csv.writer(result)
for r in rdr:
wtr.writerow( ( r[0], r[1], r[2] ) )
编辑:匿名'建议,我想出了下面的代码。问题是在我的某个地方,如果" /" elif"我无法获得正确的输出。输出I currenlty get不正确,如下所示。请协助。
import csv
CODE0 = '25'
CODE1 = '50'
CODE2 = '500'
CODE3 = '900'
with open('input.csv', 'r') as source, open('output.csv', 'w') as result:
reader = csv.reader(source)
writer = csv.writer(result)
for row in reader:
val = row[2]
if val <= CODE0: # below 25 order urgent
writer.writerow( ( row[0], row[1], row[2], 'order urgent'))
elif val <= CODE1: # below 50 order now
writer.writerow( ( row[0], row[1], row[2], 'order now'))
elif val <= CODE2: # below 500 order next month
writer.writerow( ( row[0], row[1], row[2], 'order next month'))
elif val < CODE3: # below 900 order next month
writer.writerow( ( row[0], row[1], row[2], 'order next month'))
elif val >= CODE3: #over 900 no order necessary
writer.writerow( ( row[0], row[1], row[2], 'no order necessary'))
Output.csv
duck,35,35,order now
car,100,502,order next month
baseball,200,950,no order necessary
gun,500,495,order now (this is wrong, should be next month)
taco,300,300,order now (this is wrong, should be next month)
guitar,100,700,order next month
barbie, 200,25,order urgent
gum,300,19,order urgent
编辑:我采取了另一条路线,用Anonymou的指导解决了我的问题。请看下面对我有用的东西:我不得不放弃大于和范围。我还必须删除&#34; val&#34;使它正常工作。
import csv
with open 'input.csv', 'r') as source
rdr = csv.reader(source)
with open ('output.csv', 'w', newline = '') as result:
wtr = csv.writer(result)
for r in rdr:
if int (r[2]) in range(0,36):
wtr.writerow ( ( r[0], r[1], 'order urgent' ) )
elif int(r[2]) in range(36,51):
wtr.writerow ( ( r[0], r[1], 'order now' ) )
elif int(r[2]) in range(51,501):
wtr.writerow ( ( r[0], r[1], 'order next month' ) )
elif int(r[2]) in range(501,999):
wtr.writerow ( ( r[0], r[1], 'no need to order' ) )
答案 0 :(得分:1)
您需要有一个功能或某些东西来处理数据(第3列)。这是一种方法:
extern crate clap;
use self::clap::Arg;
use std::env;
pub struct Params {
username: Option<String>,
}
impl Params {
fn new() -> Params {
Params {
username: env::var("USERNAME").ok(),
}
}
fn get_username_arg(&self) -> Arg {
let arg = Arg::with_name("Username")
.short("u")
.long("username")
.takes_value(true);
if let Some(d) = self.username.as_ref().map(String::as_str) {
arg.default_value(d)
} else {
arg.required(true)
}
}
}
fn main() {
let params = Params::new();
let arg = params.get_username_arg();
}
我必须添加一些代码来保持文件包含的奇怪间距。根据需要进行调整。
答案 1 :(得分:0)
我假设可用金额列影响最终csv文件中的结果。我建议你看一下pandas包,它允许轻松操作csv文件。您可以将第一个文件读入pandas并创建一个新列,其值取决于可用量列中的值。像这样:
import pandas as pd
df = pd.read_csv("Interim_results.csv")
for i in range(len(df)):
if df.loc[i, "amt"] > 50:
df.loc[i, "new"] = "Order Now"
# Add other if statements to suit your needs
df = df.drop('amt', 1)
df.to_csv("Final.csv")