Насколько известно, для компонента ScrollView требуется только один дочерний элемент. Попробуйте обернуть все, включая ваш GridLayout, в один LinearLayout.
С здесь :
Encoding fileEncoding = GetFileEncoding(csvFile);
// get rid of all doublequotes except those used as field delimiters
string fileContents = File.ReadAllText(csvFile, fileEncoding);
string fixedContents = Regex.Replace(fileContents, @"([^\^,\r\n])""([^$,\r\n])", @"$1$2");
using (CsvReader csv =
new CsvReader(new StringReader(fixedContents), true))
{
// ... parse the CSV
Я публикую это как ответ, чтобы я мог объяснить, как я это сделал и почему ... Ответ от Митча Уитта был тем, который дал мне лучшее решение для этого случая, и мне просто пришлось немного изменить его из-за в формат, в который были экспортированы эти данные.
Вот код VB:
Dim fixedContents As String = Regex.Replace(
File.ReadAllText(csvFile, fileEncoding),
"(?<!,)("")(?!,)",
AddressOf ReplaceQuotes)
Использовать RegEx - это то, что мне нужно было изменить, потому что в некоторых полях содержались неэкранированные кавычки, а предоставленный RegEx не показывался работать на всех примерах. В этом случае используются «Look Ahead» и «Look Behind», чтобы узнать, идет ли кавычка сразу после запятой или непосредственно перед. В этом случае они оба отрицательны (то есть показывают, где двойная кавычка не до или после запятой). Это должно означать, что кавычка находится в середине строки.
В этом случае вместо прямой замены я использую функцию ReplaceQuotes, чтобы справиться с этим для меня. Я использую это потому, что мне нужно было немного дополнительной логики, чтобы определить, было ли это в начале строки. Если бы я потратил на это еще больше времени, я уверен, что мог бы настроить RegEx, чтобы учесть начало строки (используя MultiLine и т. Д.), Но когда я попробовал это быстро, это не сработало все.
Имея это в виду, используя CSV-ридер для CSV-файла размером 32 МБ (около 19000 строк), чтение файла, выполнение регулярного выражения, загрузка его в CSV-ридер и добавление всех данных в мой общий файл занимает около 2 секунд. класс и финиш. Очень быстро !!
Я уверен, что мог бы настроить RegEx, чтобы принять во внимание начало строки (используя MultiLine и т. Д.), Но когда я попробовал это быстро, это не сработало вообще.Имея это в виду, используя CSV-ридер для CSV-файла размером 32 МБ (около 19000 строк), чтение файла, выполнение регулярного выражения, загрузка его в CSV-ридер и добавление всех данных в мой общий файл занимает около 2 секунд. класс и финиш. Очень быстро !!
Я уверен, что мог бы настроить RegEx, чтобы принять во внимание начало строки (используя MultiLine и т. Д.), Но когда я попробовал это быстро, это не сработало вообще.Имея это в виду, используя CSV-ридер для CSV-файла размером 32 МБ (около 19000 строк), чтение файла, выполнение регулярного выражения, загрузка его в CSV-ридер и добавление всех данных в мой общий файл занимает около 2 секунд. класс и финиш. Очень быстро !!
Я рекомендую просмотреть TextFieldParserClass в .Net. Вы должны включить
Imports Microsoft.VisualBasic.FileIO.TextFieldParser
Вот краткий пример:
Dim afile As FileIO.TextFieldParser = New FileIO.TextFieldParser(FileName)
Dim CurrentRecord As String() ' this array will hold each line of data
afile.TextFieldType = FileIO.FieldType.Delimited
afile.Delimiters = New String() {","}
afile.HasFieldsEnclosedInQuotes = True
' parse the actual file
Do While Not afile.EndOfData
Try
CurrentRecord = afile.ReadFields
Catch ex As FileIO.MalformedLineException
Stop
End Try
Loop
Есть как минимум драйверы ODBC для файлов CSV. Но есть разные разновидности CSV.
Что произвело эти файлы? Не исключено, что есть соответствующий драйвер, основанный на требованиях исходного приложения.
Ваша проблема с CSVReader заключается в том, что в кавычку в третьей записи не добавляется другая кавычка (она же двойная кавычка) , Если вы не избежите их, то как бы вы ожидали обработать ", в середине текстового поля?
http://en.wikipedia.org/wiki/Comma-separated_values
(я закончил до работы с файлами (с разными разделителями), но символы кавычек внутри текстового значения не были экранированы, и я закончил тем, что написал свой собственный синтаксический анализатор. Я не знаю, было ли это абсолютно необходимо или нет.
Логика этого нестандартного подхода такова: читать файл по одной строке за раз, разбивать каждую строку на запятую, удалять первый и последний символ (удаляя внешние кавычки, но не затрагивая любые внутренние кавычки), затем добавление данных в общий список. Он короткий и очень удобный для чтения и работы.
Dim fr As StreamReader = Nothing
Dim FileString As String = ""
Dim LineItemsArr() as String
Dim FilePath As String = HttpContext.Current.Request.MapPath("YourFile.csv")
fr = New System.IO.StreamReader(FilePath)
While fr.Peek <> -1
FileString = fr.ReadLine.Trim
If String.IsNullOrEmpty(FileString) Then Continue While 'Empty Line
LineItemsArr = FileString.Split(",")
For Each Item as String In LineItemsArr
'If every item will have a beginning and closing " (quote) then you can just
'cut the first and last characters of the string here.
'i.e. UpdatedItems = Item. remove first and last character
'Then stick the data into your Generic List (Of String()?)
Next
End While
Попробуйте этот сайт. http://kbcsv.codeplex.com/
Я искал хорошую утилиту, и это, безусловно, лучшее, что я нашел, и работает правильно. Не тратьте время попусту, пробуя что-то другое, это бесплатно и работает.
Как говорится в этой ссылке ... Не запускайте собственный анализатор CSV!
Используйте TextFieldParser, как предложил Avi. Microsoft уже сделала это за вас. Если вы закончили писать один и нашли в нем ошибку, подумайте о его замене, а не исправлении. Я сделал это недавно, и это сэкономило мне много времени.