2015-08-11 1 views
1

У меня возникли проблемы с поиском метасимвола для «Unit Separator» для замены вкладок в плоском файле.Заменить вкладки (« t») в плоском файле с помощью «Unit Separator» (0x1f) в C#

До сих пор у меня есть это:

File.WriteAllLines(outputFile, 
    File.ReadLines(inputFile) 
    .Select(t => t.Replace("\t", "\0x1f"))); //this does not work 

Я также попытался:

File.WriteAllLines(outputFile, 
    File.ReadLines(inputFile) 
    .Select(t => t.Replace("\t", "\u"))); //also doesn't work 

И

File.WriteAllLines(outputFile, 
    File.ReadLines(inputFile) 
    .Select(t => t.Replace("\t", 0x1f))); //also doesn't work 

Как правильно использовать шестигранник в качестве параметра? Кроме того, что метасимвол для «Unit Сепаратор"

+1

Первый вариант почти такой; только вам не нужно '0' между' \ 'и' x'. Проверьте раздел 2.4.4.4 Спецификации языка C# (можно загрузить на https://www.microsoft.com/en-us/download/details.aspx?id=7029) – ach

ответ

2

метасимвол для единичного сепаратора

U+001f 

вы должны быть в состоянии использовать его как

File.WriteAllLines(outputFile, 
File.ReadLines(inputFile) 
.Select(t => t.Replace("\t", "\u001f"))); 

EDIT: Поскольку началось обсуждение контрольных символов, добавьте это определение для потомства.

Специальный, непечатный g, который начинает, изменяет или завершает работу функции, события, операции или управления. Набор символов ASCII определяет 32 управляющих символа. Первоначально эти коды были разработаны для управления машинами телетайпа. Однако теперь они часто используются для управления мониторами мониторов, принтерами и другими современными устройствами.

от here.

также, здесь есть описание блока сепаратора

Мельчайшие элементы данных должны храниться в базе данных называются единицами в определении ASCII. Мы бы назвали их полем сейчас. Разделитель блоков разделяет эти поля в среде хранения последовательных данных. Большинство современных реализаций базы данных требуют, чтобы поля большинства типов имели фиксированную длину. Достаточно места в записи выделяется для хранения максимально возможного члена каждого поля, даже если это не обязательно в большинстве случаев. Во многих ситуациях это занимает много места. Контрольный код США позволяет всем полям иметь переменную длину. Если пространство хранения данных ограничено - как в шестидесятые годы - это хороший способ сохранить ценное пространство. С другой стороны, последовательное хранилище гораздо менее эффективно, чем оперативная память и управляемые таблицами в реальном времени. Я не могу представить ситуацию, когда работают современные базы данных SQL с данными, хранящимися на бумажной ленте или магнитных катушках ...

от here.

+0

Я даю ему пропуск (9-миллиметровые записи load) .... Я буду использовать bcp для импорта в SQL Server, в моей инструкции bcp, я использую -t "\ u001f" или -t "u001f" или -'tu001f' для терминатора поля? –

+0

@JeffOrris прочитал мое редактирование о символе юникода, \ u001f действительно может быть правильным. Я считаю, что ответ пепла не работал из-за второго \ в его '\ u001f'. попробуйте без него и посмотрите. что касается вопроса в ваших комментариях, я не уверен – psoshmo

+0

Кажется, что это могло сработать ... do Separoators выглядят как прозрачный прямоугольник (длинная боковая вершина)? –

0

Я думаю, что правильный способ кодирования символов Unicode в C# - использовать формат \unnnn. Вы можете попробовать заменить его строкой \u001f, например, так:

File.WriteAllLines(outputFile, 
    File.ReadLines(inputFile) 
    .Select(t => t.Replace("\t", "\001f"))); 

ли это работает?

+0

Я даю ему пропуск (9-миллиметровые записи для загрузки) .... Я буду использовать 'bcp' для импортировать в SQL Server, в моей инструкции 'bcp', я использую' -t '\\ u001f "или' -tu001f' для терминатора поля? –

+0

Это не сработало ... заменили мои вкладки на '\ u001f' –

+0

Почему двойной обратный слэш? Одной обратной косой черты достаточно. – ach

0

Это должно получить, где вы должны быть:

 char unitSeperatorChar = (char)Convert.ToInt32("0x1f", 16); 
     string contents = File.ReadAllText(inputFile); 
     string convertedContents = contents.Replace('\t', unitSeperatorChar); 
     File.WriteAllText(outputFile, convertedContents); 

Я загрузил в строку, преобразованные и повторно сохранены. Вы можете комбинировать их для повышения эффективности памяти при управлении строкой.

+0

Я не спустил вас вниз ... Я буду пытаться это сделать дальше. –

+1

Просто вопрос для тех, кто голосует за этот ответ: Почему? Мне интересно, почему вы считаете это неправильным или недействительным, чтобы я мог улучшить свои ответы в будущем. –

+1

1) '(char) 0x1f' равно вашей первой строке. 2) 'File.ReadLines' возвращает' IEnumerable 'not string 3 '. Второй параметр' File.WriteAllLines' - 'IEnumerable ' Итак, прежде чем любопытно, поместите свой код в VS или LinqPad и протестируйте его. – EZI