Это дает вам то, что вы хотите, учитывая ввод:
a[0].split('"')[1].replace(",", "#")
Но что-то подсказывает мне, что это не слишком полезно / общее.
Но, в любом случае, решение проблемы такого рода, вероятно, будет включать следующие два метода строки / списка: split
и replace
https://docs.python.org/3/ library / stdtypes.html # str.split
https://docs.python.org/3/library/stdtypes.html#str.replace
[1113 ] update
Итак, если вам нужно использовать RDD-искру, вы можете сначала создать RDD, используя список строк (еще не CSV-файл)
>>> rdd = sc.parallelize(a)
>>> rdd.take(1)
['0,Italy,"Aromas include tropical fruit, broom, brimstone and dried herb. The palate isnt overly expressive, offering unripened apple, citrus and dried sage alongside brisk acidity.",Vulk\xc3\xa0 Bianco,87,,Sicily & Sardinia,Etna,,Kerin O\xe2\x80\x99Keefe,@kerinokeefe,Nicosia 2013 Vulk\xc3\xa0 Bianco (Etna),White Blend,Nicosia']
>>> processed_rdd = rdd.map(lambda row: row.split('"')[0] + row.split('"')[1].replace(",", "#") + row.split('"')[2])
>>> processed_rdd.take(1)
['0,Italy,Aromas include tropical fruit# broom# brimstone and dried herb. The palate isnt overly expressive# offering unripened apple# citrus and dried sage alongside brisk acidity.,Vulk\xc3\xa0 Bianco,87,,Sicily & Sardinia,Etna,,Kerin O\xe2\x80\x99Keefe,@kerinokeefe,Nicosia 2013 Vulk\xc3\xa0 Bianco (Etna),White Blend,Nicosia']
Есть несколько предположения Я делаю, потому что вы предоставили только один пример строки.
Эти предположения касаются существования этой строки в двойных кавычках " "
, которая является столбцом с запятыми, нуждающимися в замене.
Далее, я предполагаю, что "
нет ни в одном из других столбцов.
Я также предполагаю, что этот столбец не нуждается в тех "
после обработки.
Метод rdd
map
отобразит функцию на каждую строку в СДР, а лямбда, которую принимает map
, возвращает новую строку. Итак, здесь я отображаю эту замещающую цепочку команд для каждой строки в СДР (а затем в примере я take
один)
Я предполагаю, что это связано с тем, что сообщение об обновлении обрабатывается не в том потоке. Фон: каждый поток имеет свою очередь сообщений. Сообщения, помещенные в очередь сообщений, будут по умолчанию помещаться в ту же ветку, что и вызывающая сторона. Поэтому обратный вызов может публиковать сообщение не в том потоке.
Попробуйте это: переместите метод AddNumber () в форму и используйте Invoke () (унаследованный Control), чтобы добавить элемент в правильный поток. Это может избавить от проблемы.
Отредактируйте , чтобы отразить ваши действия: The UI doesn't have to know about your component. What you need is just a proper synchronization between adding the item to your list and the UI, since UI updates will oly work if the thread matches. Therefore, you might want to supply the Control to your class which wraps the BindingList, and then do the Invoke on the list itself. This makes the list worry about triggering the upate on the UI thread and does take the worry from both the UI and the external component of invoking the handler on the correct thread.
Like this:
internal class ListBoxDataBindingSource {
private readonly Control uiInvokeControl;
private readonly BindingList<Item> list = new BindingList<Item>();
public ListBoxDataBindingSource(Control uiInvokeControl) {
if (uiInvokeControl == null) {
throw new ArgumentNullException("uiInvokeControl");
}
this.uiInvokeControl = uiInvokeControl;
CDIIWrapper.setFP(AddNumber);
}
public void AddNumber(int num) {
Item item = new Item(num.ToString());
if (uiInvokeControl.InvokeRequired) {
uiInvokeControl.Invoke(list.Add, item);
} else {
list.Add(item);
}
}
private BindingList<Item> List {
get {
return list;
}
}
}
Вместо того, чтобы setFP установил обратный вызов в lbDataBindingSource.AddNumber, создайте частный метод в своем коде для обработки обратного вызова и затем вызовите lbDataBindingSource.AddNumber из этого обратного вызова.
void MyForm_Load(object sender, EventArgs e)
{
//...
cdll.setFP(FPCallback);
}
private void FPCallback(int num)
{
lbDataBindingSoruce.AddNumber(num);
}