|
|
|
Убрать #13#10 между " и "
|
|||
|---|---|---|---|
|
#18+
Всем здравствуйте! Понадобилось CSV распарсить. Решил попробовать Грузить строки в TStringList методом LoadFromFile (файла небольшие, относительно) и разбиваю на строки значения с помощью SplitString. И всё бы работало хорошо, если бы не #13#10 внутри значений строк CSV - строка загружается не полностью, без учёта того что перевод строки внутри двойных кавычек. Вопрос к тем кто сталкивался с подобной проблемой - как её малой кровью решить? По склоняюсь к варианту предварительной подготовки файла - удаления переводов строк между " и ". Но это попахивает неким извратом + неизвестно в какой кодировке может прийти файл. Может быть кто-то уже решал подобную задачу? Именно такого варианта проблемы я тут не нашёл (плохо искал?), иначе бы не создавал топик. Спасибо! p.s. Пробовал задавать у TStringList QuoteChar := '"' - не помогло. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2017, 07:40:25 |
|
||
|
Убрать #13#10 между " и "
|
|||
|---|---|---|---|
|
#18+
Romka-Fes, StringReplace : убей все, что мешает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2017, 08:43:02 |
|
||
|
Убрать #13#10 между " и "
|
|||
|---|---|---|---|
|
#18+
Romka-Fes, Могу только посоветовать использовать АДО. АДО откроет файл CSV в виде обычного датасета, и далее - работать с датасетом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2017, 09:13:13 |
|
||
|
Убрать #13#10 между " и "
|
|||
|---|---|---|---|
|
#18+
Gerasimenko, Для StringReplace нужна строка. Как я уже писал, строки я загружаю с помощью LoadFromFile и как раз если в значении между разделителями CSV , пусть даже и в double quotes, есть разрыв строки (#13#10) - то строка загружается не полная, а та её часть, которая до разрыва строки имеет место быть. Как вариант - загрузить весь файл изначально в строку и с этой большой строкой работать. Но удалить ВСЕ переносы строк нельзя. Иначе файл CSV станет весь одной большой строкой. Попробовал извратиться так - получилось. Но пришлось тип строки на Ansi поменять: FileStr: AnsiString; Наверное, надо курить TEncoding чтобы файлы с любыми кодировками нормально обрпабатывались? #13#10 - мне нужно оставить в файле, а #10, без предшествующего символа #13 - надо заменить на пробел. #2 выбрал как временный маркер. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2017, 09:58:22 |
|
||
|
Убрать #13#10 между " и "
|
|||
|---|---|---|---|
|
#18+
Valery_B, Не хочется из пушки по воробьям стрелять как-то.... Есть куча всяких готовых компонентов, не проверял их, правда... Тут банальная работа с текстовым файлом.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2017, 09:59:35 |
|
||
|
Убрать #13#10 между " и "
|
|||
|---|---|---|---|
|
#18+
Romka-FesGerasimenko, Для StringReplace нужна строка. Как я уже писал, строки я загружаю с помощью LoadFromFile и как раз если в значении между разделителями CSV , пусть даже и в double quotes, есть разрыв строки (#13#10) - то строка загружается не полная, а та её часть, которая до разрыва строки имеет место быть. ... http://www.delphibasics.ru/TStringList.php ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2017, 10:22:50 |
|
||
|
Убрать #13#10 между " и "
|
|||
|---|---|---|---|
|
#18+
Romka-FesНе хочется из пушки по воробьям стрелять как-то.... Есть куча всяких готовых компонентов, не проверял их, правда... Тут банальная работа с текстовым файлом.... Потом сравни количество затраченного времени на "самопал", и говори о стрельбе по воробьям. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2017, 11:34:29 |
|
||
|
Убрать #13#10 между " и "
|
|||
|---|---|---|---|
|
#18+
Romka-Fes, Написать простейший парсер за пять минут не предлагать ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2017, 14:03:52 |
|
||
|
Убрать #13#10 между " и "
|
|||
|---|---|---|---|
|
#18+
Пройди по StringList после загрузки, если последний символ в какой-то строке кавычка, а в следующей строке первый символ кавычка, то склей их. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2017, 14:06:03 |
|
||
|
Убрать #13#10 между " и "
|
|||
|---|---|---|---|
|
#18+
Valery_BRomka-FesНе хочется из пушки по воробьям стрелять как-то.... Есть куча всяких готовых компонентов, не проверял их, правда... Тут банальная работа с текстовым файлом.... Потом сравни количество затраченного времени на "самопал", и говори о стрельбе по воробьям. Сравнить его с чем именно? TstringList.LoadFromFile и SplitString - это "самопал"? :) Я же писал о том что файлы небольшие. Парсинг и валидация данных файла в пол метра проходит за 1-2 секунды. Это вписывается в требования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2017, 16:07:31 |
|
||
|
Убрать #13#10 между " и "
|
|||
|---|---|---|---|
|
#18+
Gerasimenko, Пробовал задавать у TStringList QuoteChar := '"' - не помогло. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2017, 16:11:54 |
|
||
|
Убрать #13#10 между " и "
|
|||
|---|---|---|---|
|
#18+
Arioch, почти всё шароварь. Спасибо, не надо. Да и был я там не раз и ранее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2017, 16:14:02 |
|
||
|
Убрать #13#10 между " и "
|
|||
|---|---|---|---|
|
#18+
Romka-Fes, Грузишь файл в список. Для каждой строки проверяешь условие: число " в строке должно быть четным. Если нечетное - лепишь к строке следующую с ее Trim() и пробелом в начале (чтобы слова не склеились) и опять проверяешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2017, 17:51:13 |
|
||
|
Убрать #13#10 между " и "
|
|||
|---|---|---|---|
|
#18+
DarkMaster, А если в самой строке присутствует " ? Опираться на чётность кол-ва " - не вариант. Пока ничего лучше удаления #10 без предшествующего #13 не придумал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2017, 17:48:13 |
|
||
|
Убрать #13#10 между " и "
|
|||
|---|---|---|---|
|
#18+
Romka-Fesа если в самой строке присутствует " ? Надо пойти, и почитать что такое CSV. Если есть начало " то мы должны найти конец " притом \" не будет считаться концом, это экранирование. Если нет " то ищем конечную запятую. Что бы не нагружать копирование, можно сделать банальный while и делать inc(Len) и потом через move копировать. ... Но для начала, надо найти конец строки. А потом сделать for до N позиции. И потом от N позиции найти второй конец строки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2017, 00:42:59 |
|
||
|
Убрать #13#10 между " и "
|
|||
|---|---|---|---|
|
#18+
Попил чаёк, и реализовал на скорую руку пример Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. Подаём на вход 1997,Ford,E3"50,"ac, \" abs, moon",3000.00 1999,Chevy,"Venture «Extended Edition»","",4900.00 1996,Jeep,Grand Cherokee,"MUST SELL! air, moon roof, loaded",4799.00 Распечатываем массив, и получаем 1997 Ford E3"50 ac, \" abs, moon 3000.00 -------------- 1999 Chevy Venture <Extended Edition> 4900.00 -------------- 1996 Jeep Grand Cherokee MUST SELL! air, moon roof, loaded 4799.00 -------------- ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2017, 01:50:39 |
|
||
|
Убрать #13#10 между " и "
|
|||
|---|---|---|---|
|
#18+
Кое чего не доглядел. Фикс Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2017, 02:07:25 |
|
||
|
Убрать #13#10 между " и "
|
|||
|---|---|---|---|
|
#18+
"Venture «Extended Edition»","" -> Venture <Extended Edition> Это как ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2017, 02:59:17 |
|
||
|
Убрать #13#10 между " и "
|
|||
|---|---|---|---|
|
#18+
rgreat"Venture «Extended Edition»","" -> Venture <Extended Edition> Это как ? В Консоль не правильно выводит. В дебаггере всё отлично показывает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2017, 09:06:11 |
|
||
|
Убрать #13#10 между " и "
|
|||
|---|---|---|---|
|
#18+
Няшикrgreat"Venture «Extended Edition»","" -> Venture <Extended Edition> Это как ? В Консоль не правильно выводит. В дебаггере всё отлично показывает. В мемориз! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2017, 10:15:27 |
|
||
|
Убрать #13#10 между " и "
|
|||
|---|---|---|---|
|
#18+
Няшикпритом \" не будет считаться концом, это экранирование. Что-то в https://tools.ietf.org/html/rfc4180 ни про символ \, ни про его код ничего нет. Там две двойных кавычки подряд (""). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2017, 19:58:45 |
|
||
|
Убрать #13#10 между " и "
|
|||
|---|---|---|---|
|
#18+
DunkinНяшикпритом \" не будет считаться концом, это экранирование. Что-то в https://tools.ietf.org/html/rfc4180 ни про символ \, ни про его код ничего нет. Там две двойных кавычки подряд (""). Потому что это экранирующий символ. Многие инструменты, в частности в PHP функция - str_getcsv позволяет менять этот символ \ на " и.т.д. К примеру, что бы экранирование было двумя "" -> " Common usage of CSV is US-ASCII, but other character sets defined by IANA for the "text" tree may be used in conjunction with the "charset" parameter. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2017, 21:55:55 |
|
||
|
Убрать #13#10 между " и "
|
|||
|---|---|---|---|
|
#18+
Няшик, "Надо пойти, и почитать что такое CSV." - кому надо - тот почитает. Я вот читал. И то, как сохраняет тот же Excel в CSV, с разделителями таки ";" - это никак не соответствует стандартам. Но, надо исходить из реалий. А они таковы что пользователь может (случайно, специально, неважно) влепить " в самой строке в Excek и потом выдать такой файл, который далее должен будет импортироваться неким софтом. Так что в контексте этих реалий я и писал о том что в случае наличия " в самой строке, вариант DarkMaster с проверкой чётности - таки не вариант. Как бы там ни было - спасибо за идею и реализацию, но я таки оставлю свою. Файл уже будет откорректирован и при передаче другим пользователям/системам - этот нюанс с переводом строки , теоретически, не "всплывёт" вновь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2017, 16:01:59 |
|
||
|
Убрать #13#10 между " и "
|
|||
|---|---|---|---|
|
#18+
Romka-Fes И то, как сохраняет тот же Excel в CSV, с разделителями таки ";" - это никак не соответствует стандартам. Но, надо исходить из реалий. Зайди в Control Panel, замени "разделитель элементов списка" на запятую и радуйся соответствию стандартам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2017, 18:47:55 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39525362&tid=2041788]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
464ms |
get topic data: |
14ms |
get forum data: |
4ms |
get page messages: |
76ms |
get tp. blocked users: |
2ms |
| others: | 233ms |
| total: | 826ms |

| 0 / 0 |
