Цикличное выполнение через таблицу данных и удаляет строку

Сначала вы можете получить все каталоги файлов:

all.files = list.files(recursive = T)

Затем ваш CSV-файл будет иметь те файлы, которые имеют наибольшее количество прямых слешей (как вы сказали, это всегда последний:

]
library(magrittr)
all.files[stringr::str_count(all.files, pattern = "/") %>% .[equals(., max(.))]]

поочередно, если это единственные CSV-файлы в ваших подкаталогах, ваша работа будет намного проще:

csv.files = grep(pattern = ".csv", all.files, value = T)

или, если целевые CSV-файлы находятся на самом низком уровне, но не только те, которые там есть, и не единственные CSV-файлы в подкаталогах, вы можете объединить эти два:

all.files[stringr::str_count(all.files, pattern = "/") %>% .[equals(., max(.))]] %>% grep(pattern = "csv",., value = T)
7
задан tvanfosson 24 November 2008 в 18:30
поделиться

5 ответов

Если доктор Length является нулем, то Ваш выбор не возвратил строк. Если Вы хотите удалить строки, которые не соответствуют Вашим критериям, то я реализовал бы это как другой тип запроса. Могло также случиться так, что я полностью неправильно понимаю Ваш вопрос. Могли Вы обновлять свой вопрос показать Ваш SQL и указать, где в примере кода у Вас есть проблема: в цикле или после цикла, где у Вас есть свой комментарий?

4
ответ дан 6 December 2019 в 06:52
поделиться

Я не уверен, что полностью понимаю Ваш вопрос, но кажется, что Вы пытаетесь удалить запись из набора, в то время как Вы - все еще цикличное выполнение по нему. (который вызовет ошибку индекса массива),

Необходимо сохранить ссылку на каждую запись, которую Вы хотите удалить в новом наборе и затем удалить все новые записи из старого набора:

DataRow[] dr = payments.dtPayments.Select(myselect);
List<DataRow> rowsToRemove = new List<DataRow>();

for (int a = 0; a < dr.Length; a++) {
    if(/* You want to delete this row */) {
        rowsToRemove.Add(dr[a]);
    }
}

foreach(var dr in rowsToRemove) {
    payments.dtPayments.Rows.Remove(dr);
}
18
ответ дан 6 December 2019 в 06:52
поделиться

Необходимо создать datarow вне цикла, затем когда Вы добираетесь до строки, Вы хотите удалить, присваивают его строке, которую Вы создали снаружи. и повредите цикл. Затем ниже цикла можно удалить его.

DataRow r = null;
foreach(DataRow row in table.Rows)
{
   if(condition==true)
   {
      r = row;
      break;
   }
}

table.Rows.Remove(r);
2
ответ дан 6 December 2019 в 06:52
поделиться

Вы попробовали это?

payments.dtPayments. Строки. Удалите (доктор)

1
ответ дан 6 December 2019 в 06:52
поделиться

Можно циклично выполниться через набор наоборот (для (интервал i=rows.length-1; x>-1; x-)) удалить несколько строк, чтобы гарантировать Вам не вытащит индекс из связанных ошибок.

1
ответ дан 6 December 2019 в 06:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: