В одной строке javascript:
var isMobile = ('ontouchstart' in document.documentElement && navigator.userAgent.match(/Mobi/));
Если пользовательский агент содержит «Mobi» (согласно MDN) и ontouchstart доступен, то, скорее всего, это будет мобильное устройство.
В CSV есть предопределенные способы обработки этого. Этот сайт предоставляет легко читаемое объяснение стандартного способа обработки всех предостережений CSV .
Тем не менее, действительно нет причин не использовать надежную библиотеку с открытым исходным кодом для чтения и записи CSV файлы, чтобы не допускать нестандартных ошибок. LINQtoCSV - моя любимая библиотека для этого. Он поддерживает чтение и запись простым и понятным способом.
В качестве альтернативы этот вопрос SO о библиотеках CSV предоставит вам список наиболее популярных вариантов.
Вместо того, чтобы проверять, отсутствует ли в текущей строке (") в качестве первого символа, вместо этого проверьте, является ли последний символ ("). Если это не так, вы знаете, что у вас есть разрыв строки, и вы можете прочитать следующую строку и объединить ее.
Я предполагаю, что данные вашего примера были точными - поля были заключены в кавычки. Если кавычки могут не ограничивать текстовое поле (или новые строки каким-то образом обнаруживаются в нетекстовых данных), тогда все ставки отключены!
Я недавно использовал этот фрагмент кода для анализа строк из файла CSV (это упрощенная версия):
private void Parse(TextReader reader)
{
var row = new List<string>();
var isStringBlock = false;
var sb = new StringBuilder();
long charIndex = 0;
int currentLineCount = 0;
while (reader.Peek() != -1)
{
charIndex++;
char c = (char)reader.Read();
if (c == '"')
isStringBlock = !isStringBlock;
if (c == separator && !isStringBlock) //end of word
{
row.Add(sb.ToString().Trim()); //add word
sb.Length = 0;
}
else if (c == '\n' && !isStringBlock) //end of line
{
row.Add(sb.ToString().Trim()); //add last word in line
sb.Length = 0;
//DO SOMETHING WITH row HERE!
currentLineCount++;
row = new List<string>();
}
else
{
if (c != '"' && c != '\r') sb.Append(c == '\n' ? ' ' : c);
}
}
row.Add(sb.ToString().Trim()); //add last word
//DO SOMETHING WITH LAST row HERE!
}
Возможно, вы могли бы посчитать (") во время ReadLine (). Если они нечетные, это поднимет флаг. Вы можете либо игнорировать эти строки, либо получить следующие две и исключить первое "\ n" вхождение строк слияния.
Обычно я читаю текст посимвольно, а не построчно, из-за этой самой проблемы.
Когда вы читаете каждый символ, вы должны быть в состоянии выяснить, где каждая ячейка начинается и заканчивается, а также различие между разрывом строки в строке и в ячейке: если я правильно помню, для файлов, сгенерированных Excel, в любом случае строки начинаются с \ r \ n, а новые строки в ячейках только \ r.
Прислушайтесь к советам экспертов и Не используйте собственный анализатор CSV .
Ваша первая мысль: «Как мне поступить? новые разрывы строк? »
Ваша следующая мысль:« Мне нужно обрабатывать запятые внутри кавычек ».
Следующая ваша мысль будет:« О, дерьмо, мне нужно обрабатывать кавычки внутри кавычек. Экранированные кавычки. Двойные кавычки. Одинарные кавычки ... »
Это дорога к безумию. Не пишите свои собственные. Найдите библиотеку с обширным охватом модульного тестирования, которая затрагивает все сложные моменты и прошла через ад за вас. Для .NET используйте бесплатную библиотеку FileHelpers .
Существует пример синтаксического анализатора на C #, который, кажется, правильно обрабатывает ваш случай. Затем вы можете прочитать свои данные и удалить из них разрывы строк после чтения. Часть 2 - это синтаксический анализатор, а есть Часть 1 , которая охватывает часть записи.
Прочитать строку.
Разбить на столбцы (поля).
Если для каждой строки ожидается достаточное количество столбцов, обработайте.
Если нет, прочтите следующую строку и запишите оставшиеся столбцы, пока не получите то, что вам нужно.
Повторите.
В каждой строке можно использовать несколько простое регулярное выражение. Когда он совпадает, вы обрабатываете каждое поле из совпадения. Если совпадение не найдено, вы пропускаете эту строку.
Регулярное выражение может выглядеть примерно так.
Match match = Regex.Match(line, @"^(?:,?(?<q>['"](?<field>.*?\k'q')|(?<field>[^,]*))+$");
if (match.Success)
{
foreach (var capture in match.Groups["field"].Captures)
{
string fieldValue = capture.Value;
// Use the value.
}
}
Взгляните на Библиотеку FileHelpers Он поддерживает чтение \ запись CSV с разрывами строк, а также чтение \ запись в Excel
Решение LINQy:
string csvText = File.ReadAllText("C:\\Test.txt");
var query = csvText
.Replace(Environment.NewLine, string.Empty)
.Replace("\"\"", "\",\"").Split(',')
.Select((i, n) => new { i, n }).GroupBy(a => a.n / 3);
Существует встроенный метод для чтения файлов CSV в .NET (требуется добавление ссылки на сборку Microsoft.VisualBasic):
public static IEnumerable<string[]> ReadSV(TextReader reader, params string[] separators)
{
var parser = new Microsoft.VisualBasic.FileIO.TextFieldParser(reader);
parser.SetDelimiters(separators);
while (!parser.EndOfData)
yield return parser.ReadFields();
}
Если вы имеете дело с действительно большими файлами, это Считыватель CSV утверждает, что он самый быстрый из тех, что вы найдете: http://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader
Попробуйте CSVHelper (библиотека, которую я поддерживаю). Он игнорирует пустые строки. Я считаю, что есть флаг, который вы можете установить в FastCSVReader, чтобы он также обрабатывал пустые строки.