|
|
|
Чтение строк в TStringList в полях которых есть перевод строки
|
|||
|---|---|---|---|
|
#18+
Всем доброго дня, есть csv со строками, примерно такого вида: "Field1";"Field2";"Field3";"Field4" "123";"345 577 789";"abcd";"ttttt" "654";"555";"aaaa";"bbbb" в некоторых полях встречается перевод строки. Читаю так: Код: pascal 1. 2. 3. 4. 5. 6. 7. всёравно разбивка на строки происходит по переводу строки. Всё уже перепробовал, не пойму где ошибаюсь. Посоветуйте чтото. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2021, 14:27 |
|
||
|
Чтение строк в TStringList в полях которых есть перевод строки
|
|||
|---|---|---|---|
|
#18+
Рекомендую пройти отладкой по методу TStrings.SetDelimitedText - там вы все увидите сами ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2021, 14:32 |
|
||
|
Чтение строк в TStringList в полях которых есть перевод строки
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2021, 15:00 |
|
||
|
Чтение строк в TStringList в полях которых есть перевод строки
|
|||
|---|---|---|---|
|
#18+
Cobalt747, странно, LineBreak в коде даже не упоминается ... Код: 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. значит это что DelimetedText даже нет смысла использовать. Я тут пример немного упростил, на самом деле читается через LoadFromFile, а он судя по исходнику использует SetTextStr в котором LineBreak уже присутствует: procedure TStrings.LoadFromFile(const FileName: string); var Stream: TStream; begin Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); try LoadFromStream(Stream); finally Stream.Free; end; end; procedure TStrings.LoadFromStream(Stream: TStream); begin LoadFromStream(Stream, nil); end; procedure TStrings.LoadFromStream(Stream: TStream; Encoding: TEncoding); var Size: Integer; Buffer: TBytes; begin BeginUpdate; try Size := Stream.Size - Stream.Position; SetLength(Buffer, Size); Stream.Read(Buffer, 0, Size); Size := TEncoding.GetBufferEncoding(Buffer, Encoding, FDefaultEncoding); SetEncoding(Encoding); // Keep Encoding in case the stream is saved SetTextStr(Encoding.GetString(Buffer, Size, Length(Buffer) - Size)); finally EndUpdate; end; end; procedure TStrings.SetTextStr(const Value: string); var P, PCurVal, PCurLB, PStartVal, PStartLB, PEndLB: PChar; S: string; LineBreakLen: Integer; begin BeginUpdate; try Clear; P := Pointer(Value); if P = nil then Exit; LineBreakLen := Length(LineBreak); if LineBreakLen = 0 then begin Add(Value); Exit; end; // When LineBreak is: // * sLineBreak - for compatibility with Windows, Posix and old macOS platforms, // we handle #13#10, #10 and #13 as it would be #13#10. // * NOT sLineBreak - we use strict checking for LineBreak. if CompareStr(LineBreak, sLineBreak) = 0 then begin while P^ <> #0 do begin PStartVal := P; while not (P^ in [#0, #10, #13]) do Inc(P); SetString(S, PStartVal, P - PStartVal); Add(S); if P^ = #13 then Inc(P); if P^ = #10 then Inc(P); end; Exit; end; PStartLB := Pointer(LineBreak); PEndLB := PStartLB + LineBreakLen; PCurLB := PStartLB; PStartVal := P; while P^ <> #0 do begin while (P^ <> PStartLB^) and (P^ <> #0) do Inc(P); if P^ <> #0 then begin PCurVal := P + 1; Inc(PCurLB); while PCurLB^ <> #0 do begin if PCurVal^ <> PCurLB^ then Break; Inc(PCurVal); Inc(PCurLB) end; if PCurLB = PEndLB then begin SetString(S, PStartVal, P - PStartVal); Add(S); P := PCurVal; PStartVal := P; end else Inc(P); PCurLB := PStartLB; end; end; if P > PStartVal then begin SetString(S, PStartVal, P - PStartVal); Add(S); end; finally EndUpdate; end; end; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2021, 15:05 |
|
||
|
Чтение строк в TStringList в полях которых есть перевод строки
|
|||
|---|---|---|---|
|
#18+
сделать замену в sStr #13#10 на какую-то подстроку вида '{#13#10}' а потом пробежаться по итемсам и поменять назад будет помедленнее ( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2021, 16:33 |
|
||
|
Чтение строк в TStringList в полях которых есть перевод строки
|
|||
|---|---|---|---|
|
#18+
Какой только фигнёй люди не будут маяться место написания простенького автомата на пару экранов... Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2021, 16:53 |
|
||
|
Чтение строк в TStringList в полях которых есть перевод строки
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov на пару экранов... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2021, 16:56 |
|
||
|
Чтение строк в TStringList в полях которых есть перевод строки
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Dimitry Sibiryakov на пару экранов... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2021, 17:04 |
|
||
|
Чтение строк в TStringList в полях которых есть перевод строки
|
|||
|---|---|---|---|
|
#18+
andreymx кавычки ещё пощитать же Код: pascal 1. + 5 строк на цикл чтения файла ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2021, 17:20 |
|
||
|
Чтение строк в TStringList в полях которых есть перевод строки
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ andreymx кавычки ещё пощитать же Код: pascal 1. + 5 строк на цикл чтения файла ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2021, 17:37 |
|
||
|
Чтение строк в TStringList в полях которых есть перевод строки
|
|||
|---|---|---|---|
|
#18+
andreymx это из более нового, чем мой древний д7? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2021, 17:41 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=40048193&tid=2037593]: |
0ms |
get settings: |
9ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
159ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
66ms |
get tp. blocked users: |
1ms |
| others: | 212ms |
| total: | 488ms |

| 0 / 0 |
