Другим вариантом, если производительность является проблемой, является использование расширения data.table
для расширения reshape2
расплава & amp; dcast functions
( Ссылка: эффективная перестройка с использованием data.tables )
library(data.table)
setDT(dat1)
dcast(dat1, name ~ numbers, value.var = "value")
# name 1 2 3 4
# 1: firstName 0.1836433 -0.8356286 1.5952808 0.3295078
# 2: secondName -0.8204684 0.4874291 0.7383247 0.5757814
И, как и в data.table v1.9.6, мы можем использовать несколько столбцов
## add an extra column
dat1[, value2 := value * 2]
## cast multiple value columns
dcast(dat1, name ~ numbers, value.var = c("value", "value2"))
# name value_1 value_2 value_3 value_4 value2_1 value2_2 value2_3 value2_4
# 1: firstName 0.1836433 -0.8356286 1.5952808 0.3295078 0.3672866 -1.6712572 3.190562 0.6590155
# 2: secondName -0.8204684 0.4874291 0.7383247 0.5757814 -1.6409368 0.9748581 1.476649 1.1515627
Будет ли это делать?
[^\r]\n
В основном это соответствует «\n», которому предшествует символ, который не является «\r».
Если вы этого хотите для обнаружения строк, которые начинаются с одного только «\n», а затем попробуйте
([^\r]|$)\n
, который говорит, что он должен соответствовать «\n», но только те, которые являются первым символом строки или те, которые являются not , которым предшествует «\r»
. Могут быть специальные случаи для проверки, поскольку вы возитесь с определением самих строк, «$» может не работать слишком хорошо.
EDIT: credit @Kibbee Использование look-forward s явно лучше, поскольку оно не будет захватывать соответствующий предыдущий символ и также поможет с любыми случаями краев. Итак, вот лучшее регулярное выражение + код становится:
myStr = Regex.Replace(myStr, "(?<!\r)\n", "\r\n");
myStr.Replace("([^\r])\n", "$1\r\n");
$ может потребоваться \
Если я знаю, что окончание строк должно быть одним из CRLF или LF, то что-то, что работает для меня, это
myStr.Replace("\r?\n", "\r\n");
Это по сути делает тот же ответ neslekkiM , за исключением он выполняет только одну операцию замены на строке, а не на две. Это также совместимо с двигателями Regex, которые не поддерживают отрицательные обратные ссылки или обратные ссылки.
Попробуйте следующее: Замените (Char.ConvertFromUtf32 (13), Char.ConvertFromUtf32 (10) + Char.ConvertFromUtf32 (13))
Это может быть быстрее, если вы используете это.
(?<!\r)\n
Он в основном ищет любой\n, которому не предшествует\r. Это, скорее всего, будет быстрее, потому что в другом случае почти каждая буква соответствует [^\r], поэтому она будет захватывать это, а затем искать\n после этого. В примере, который я дал, он остановится только тогда, когда он найдет\n, и перед этим посмотрим, найдет ли он\r
Я предполагаю, что «myStr» является объектом типа String, в этом случае это не регулярное выражение. \r и\n являются эквивалентами для CR и LF.
Мое лучшее предположение заключается в том, что, если вы знаете, что у вас есть строка\n для КАЖДОЙ, независимо от того, что вы сначала должны вырезать каждый \ р. Затем замените все\n на\r\n.
Ответ chakrit дает также идти, но тогда вам нужно использовать регулярное выражение, но так как вы не говорите, что такое «myStr» ...
Редактирование: просмотр других примеров говорит мне одно: почему сложные вещи, когда вы можете сделать это легко ?, Поскольку существует регулярное выражение, это не то же самое, что «нужно использовать»: D
Edit2: Инструмент очень полезен при игре с регулярным выражением, xpath и еще что-то, что дает вам странные результаты, могу ли я указать вам на: http://www.regexbuddy.com/
Я пытался сделать код ниже для строки и не работал.
myStr.Replace("(?<!\r)\n", "\r\n")
Я использовал Regex.Replace и работал
Regex.Replace( oldValue, "(?<!\r)\n", "\r\n")