如何将字符串字符串转换为Rust中的字符串数组/向量

时间:2017-03-16 02:53:20

标签: string vector rust

我有一个包含多行的CSV文件中的字符串:

编辑。 Rust不在实际的字符串中。

Vec<Vec<String>>

我正在尝试将这些推送到// the csv is raw_string let lines = raw_string.lines(); let mut mainVec = Vec::new(); for row in lines { let mut childVec = Vec::new(); let trimmed = row.trim(); let values = trimmed.split(',').collect(); childVec.push(values); mainVec.push(childVec.clone()); }

error[E0282]: unable to infer enough type information about `_`
 --> src/main.rs:9:13
  |
9 |         let values = trimmed.split(',').collect();
  |             ^^^^^^ cannot infer type for `_`
  |
  = note: type annotations or generic parameter binding required

但是我收到了错误

from openpyxl import load_workbook
# The source xlsx file is named as source.xlsx
wb=load_workbook("source.xlsx")

ws = wb.active
first_column = ws['A']

# Print the contents
for x in xrange(len(first_column)): 
    print(first_column[x].value) 

2 个答案:

答案 0 :(得分:3)

你需要给编译器一些关于你想要values的提示。

你可以说你想让它成为某事的载体

let values: Vec<_> = trimmed.split(',').collect();

Working example in the playground

关于代码的其他一些注释,如果您有兴趣的话。

  • 变量名称应为snake_case。因此,矢量应该被称为main_vecchild_vec
  • child_vec推送到main_vec时,无需克隆main_vec。将其推送到child_vec会转移所有权,并且循环重新声明finally,i add a model role pModel.append({"prname":pname[i],"prstate": qsTr(Jsclient.pstate)}); ,因此编译器可以保证此处没有违反任何内容。

答案 1 :(得分:2)

Another solution,基于迭代器:

fn main() {
    let raw_string = r"rust
header1,header2,header3
r1v1,r1v2,r1v3
r2v1,r2v2,r2v3";

    let main_vec = raw_string.lines()
                             .map(|s| s.trim().split(',').map(String::from).collect::<Vec<String>>())
                             .collect::<Vec<Vec<String>>>();

    print!("{:?}", main_vec);
}

正如@Simon Whitehead已经说过,collect()唯一需要做的就是指定类型,因为这是一种通用方法。但在某些情况下,它也可能由编译器本身推断出来。

上面的代码对类型规范非常冗长:实际上你可能会保留Vec的值类型未指定,并让编译器推导出这样的代码:

let main_vec = raw_string.lines()
                         .map(|s| s.trim().split(',').map(String::from).collect::<Vec<_>>())
                         .collect::<Vec<_>>();

有关详细信息,请参阅definition of collect() method