Чытайце фіксаваную даўжыню UTF-8 радкоў эфектыўныя

У мяне ёсць табліца, як DataModel:

<�Код> FieldA (10 chracters UTF-8)

<�Код> FieldB (12 сімвалаў UTF-8)

fieldC (11 characters UTF-8)

Кожнае поле фіксаванай даўжыні і запісваюцца ў файл (лакальнага файла на дыску) без якіх-небудзь delimmiters ў UTF-8 кадоўцы (напісанай з дапамогай StreamWriter). Выніковы файл выглядае наступным чынам:

<�Код> fieldAfieldBfieldCfieldAfieldBfieldC [...]

Я таксама ведаю amout запісаў і можа выкарыстоўваць BaseStream.Seek() для адвольнага доступу да файла.

Скажам, я хачу, каб прачытаць запіс 29nth і запоўніць маю DataModel, што было б эфектыўным (хуткі) падыход? Я магу выкарыстоўваць StreamReader і чытаць асобны паўкокс, але не тое, што праблематычна з-за UTF-8? Я б не хацеў, каб дадаць коскай мае дадзеныя і выкарыстоўваць метад падзелу радка - Я спадзяюся, што ёсць лепшы падыход для гэтага ў C #.

Гэта не для выкарыстання ў вытворчасці, вар'яты і мікра аптымізацыя вітаецца :)

Дзякуй вам за дапамогу!

0
Не :). Я чалавечае істота :)
дададзена аўтар Carlos Landeras, крыніца
Не :). Я чалавечае істота :)
дададзена аўтар Carlos Landeras, крыніца
У UTF-8 сімвал кадуецца ў 1 да 4 байт. Так што калі ў вас ёсць поля А (6 сімвалаў), а затым FieldB затым FieldB можа пачацца ў любы зрушэнне паміж 1 * 6 = 6 і 4 * 6 = 24. Там няма ніякага спосабу вызначыць гэта без дэкадавання FieldA першы. Магчымае рашэнне: падушачка кожнае поле з фіксаваным лікам байтаў, а не знакаў.
дададзена аўтар dtb, крыніца
давайце, я хацеў фарматаваць паведамленне 10 секунд пасля таго, як я адправіў пытанне і @Carlos Landeras ужо зрабіў гэта? Вы робат містэр Landeras?
дададзена аўтар Jasper, крыніца

6 адказы

Вы можаце звярнуцца ў адпаведнае месца ў файле, а затым выкарыстоўваць FileStream.Read() прачытаць адпаведнае колькасць UTF8 сімвалаў, а затым пераўтварыць яго ў радок C# па:

string s = Encoding.UTF8.GetString(buffer, 0, buffer.Length);

Ці вы можаце выкарыстоўваць StreamReader адкрыты з правільнай кадоўкай, а затым выкарыстоўваць StreamReader. чытанне (сімвал [] буфер INT індэкс, лік цэлае) прачытаць патрэбную колькасць сімвалаў (пасля шукае ў патрэбнае месца).

<�Моцны> Гэта будзе працаваць толькі калі вы сапраўды можаце звярнуцца да патрэбнага месца, як вы кажаце, у ОП!

Чытаць каментары пра зменнай даўжыні UTF8 кадоўцы знакаў!

0
дададзена
Як вы «звяртацца ў адпаведнае месца ў файле», калі файл ўтрымлівае UTF-8 закадаваныя тэкст?
дададзена аўтар dtb, крыніца
Паколькі OP сказаў: «Я таксама ведаю, колькасць запісаў і можа выкарыстоўваць BaseStream.Seek ()», з дапамогай якога я меркаваў, што запісы не будзе ўтрымліваць якіх-небудзь дадатковых сімвалаў UTF8. Я проста грунтуючыся на спецыфікацыі. ;)
дададзена аўтар Matthew Watson, крыніца
Дзякуй за ўсе іншыя, якія пісалі пра UTF-8 падводных камянёў. Мой код працуе толькі таму, што ў мяне ёсць 1 байт UTF-8 знакаў у дадзены момант. Я павінен пераасэнсаваць свой падыход.
дададзена аўтар Jasper, крыніца

Вы можаце звярнуцца ў адпаведнае месца ў файле, а затым выкарыстоўваць FileStream.Read() прачытаць адпаведнае колькасць UTF8 сімвалаў, а затым пераўтварыць яго ў радок C# па:

string s = Encoding.UTF8.GetString(buffer, 0, buffer.Length);

Ці вы можаце выкарыстоўваць StreamReader адкрыты з правільнай кадоўкай, а затым выкарыстоўваць StreamReader. чытанне (сімвал [] буфер INT індэкс, лік цэлае) прачытаць патрэбную колькасць сімвалаў (пасля шукае ў патрэбнае месца).

<�Моцны> Гэта будзе працаваць толькі калі вы сапраўды можаце звярнуцца да патрэбнага месца, як вы кажаце, у ОП!

Чытаць каментары пра зменнай даўжыні UTF8 кадоўцы знакаў!

0
дададзена
Як вы «звяртацца ў адпаведнае месца ў файле», калі файл ўтрымлівае UTF-8 закадаваныя тэкст?
дададзена аўтар dtb, крыніца
Паколькі OP сказаў: «Я таксама ведаю, колькасць запісаў і можа выкарыстоўваць BaseStream.Seek ()», з дапамогай якога я меркаваў, што запісы не будзе ўтрымліваць якіх-небудзь дадатковых сімвалаў UTF8. Я проста грунтуючыся на спецыфікацыі. ;)
дададзена аўтар Matthew Watson, крыніца
Дзякуй за ўсе іншыя, якія пісалі пра UTF-8 падводных камянёў. Мой код працуе толькі таму, што ў мяне ёсць 1 байт UTF-8 знакаў у дадзены момант. Я павінен пераасэнсаваць свой падыход.
дададзена аўтар Jasper, крыніца
<�Р> <�моцны> Кожнае поле фіксаванай даўжыні </моцны> і запісваюцца ў файл (лакальнага файла на дыску) без якіх-небудзь delimmiters ў UTF-8 кадоўцы (напісанай з дапамогай StreamWriter). </Р>

Вы кажаце, што вашы поля маюць фіксаваную даўжыню. Гэта азначае, што ў палях А файл заўсёды 10 байт (незалежна ад фактычнага зместу), FieldB заўсёды 12 байт, FieldC заўсёды 11 байт.

З вышэйсказанага, той факт, што тэкст UTF-8 не мае ніякага дачынення да гэтай праблемы.

Калі вы адкрыеце System.IO.Stream, вы можаце ўбачыць над байтамі кожнага поля, якое вы не жадаеце чытаць. Напрыклад, калі вы хочаце, каб прачытаць FieldC, то вы можаце шукаць наперад 22 байт (прапускаючы FieldA і FieldB):

stream.Seek(22, SeekOrigin.Current);

Пасля таго, як вы ў правільным месцы, вы можаце прачытаць фіксаванае колькасць байтаў, а затым дэкадаваць гэтыя байты праз UTF-8 у вашай выніковай радку.

0
дададзена
<�Р> <�моцны> Кожнае поле фіксаванай даўжыні </моцны> і запісваюцца ў файл (лакальнага файла на дыску) без якіх-небудзь delimmiters ў UTF-8 кадоўцы (напісанай з дапамогай StreamWriter). </Р>

Вы кажаце, што вашы поля маюць фіксаваную даўжыню. Гэта азначае, што ў палях А файл заўсёды 10 байт (незалежна ад фактычнага зместу), FieldB заўсёды 12 байт, FieldC заўсёды 11 байт.

З вышэйсказанага, той факт, што тэкст UTF-8 не мае ніякага дачынення да гэтай праблемы.

Калі вы адкрыеце System.IO.Stream, вы можаце ўбачыць над байтамі кожнага поля, якое вы не жадаеце чытаць. Напрыклад, калі вы хочаце, каб прачытаць FieldC, то вы можаце шукаць наперад 22 байт (прапускаючы FieldA і FieldB):

stream.Seek(22, SeekOrigin.Current);

Пасля таго, як вы ў правільным месцы, вы можаце прачытаць фіксаванае колькасць байтаў, а затым дэкадаваць гэтыя байты праз UTF-8 у вашай выніковай радку.

0
дададзена

Паколькі utf8 з'яўляецца кадаваньне з зменнай шырынёй (гэта значыць, ён выкарыстоўвае пераменнае колькасць байтаў для прадстаўлення розных знакаў) у вас мала выбару, акрамя як сканіраванне з самага пачатку.

Калі вы хочаце, каб вылічыць і перайсці да зрушэння вам трэба будзе выкарыстоўваць кадыроўку фіксаванага памеру, г.зн. UTF-32

0
дададзена

Паколькі utf8 з'яўляецца кадаваньне з зменнай шырынёй (гэта значыць, ён выкарыстоўвае пераменнае колькасць байтаў для прадстаўлення розных знакаў) у вас мала выбару, акрамя як сканіраванне з самага пачатку.

Калі вы хочаце, каб вылічыць і перайсці да зрушэння вам трэба будзе выкарыстоўваць кадыроўку фіксаванага памеру, г.зн. UTF-32

0
дададзена