PDA

نسخه کامل مشاهده نسخه کامل : عوض کردن فرمت فایل های متنی



Arshia001
28-08-2009, 14:45
سلام دوستان.

میخواستم بدونم چه جوری میشه فرمت یه فایل متنی که با System.IO.StreamWriter ذخیره میشه رو عوض کرد؟فرمت اولیه ی خودش UTF-8 هست ولی من میخوام از Unicode استفاده کنم.

ممنون.

_H2_
29-08-2009, 15:26
سلام
اگر فقط میخواهید فرمت یک فایل را عوض کنید و به شرطی که فایل کوچک باشد از همچین دستوراتی میتوانید استفاده کنید:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

ولی برای حالت کلی و فایلهای بزرگ بهتر است از Stream ها استفاده کنید.

کلاس StreamWriter هم در زمان new آرگومانی از نوع System.Text.Encoding میگیرد که میتواند مشخص کننده فرمت ذخیره سازی باشد.
Ascii و Unicode و Utf8 و utf7 و bigendianunicode و...

Arshia001
30-08-2009, 23:30
اون روش آرگومان موقع نیو کردن رو امتحان کردم،کلا فایل رو سیو نکرد...

_H2_
31-08-2009, 10:59
سلام

اون روش آرگومان موقع نیو کردن رو امتحان کردم،کلا فایل رو سیو نکرد...
نمیدانم چه کدی نوشتید ولی ایراد از کد شما بوده و ضمناً اگر فایلی را درون برنامه تولید میکنید، باید همانجا و در زمان save فرمت را تایین کنید.
منظورم آن است که هیچگاه فایل را save نکنید و بعد بیایید (مثلاً بلا دستوری که مثال زدم) فرمت آن را اصلاح کنید.

=====

من منظورم همچین کدی بود و این کد به سادگی کار میکند.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

میتوانید به جای UTF8 با هر فرمت دیگری ذخیره کنید.
سعی کنید ایراد کد خودتان را پیدا کنید.
در صورت عدم حل مشکل، کدهایتان را اینجا درج کنید.
موفق باشید.

Arshia001
01-09-2009, 14:48
من قبلا کدمو کامل نوشتم،ولی وقتی متن فارسی به برنامه میدم،بعد از اینکه سیوش میکنم با بعضی برنامه های دیگه درست باز نمیکنه که وقتی با Notepad فرمتشو عوض میکنم درست میشه.توی کد خودم فقط همون خط New کردن StreamWriter رو عوض کردم وقتی اجرا کردم چیزی توی فایل ننوشت،در حالی که بدون فرمت درست کار میکنه.

_H2_
02-09-2009, 12:44
سلام
فرمت فایلتان را در Notepad به چی تغییر میدید؟

بحرحال کد زیر هموراه و بدون شک و تردید صحیح کار خواهد کد و اگر برنامه شما مشکل دارد باید ان را در کدهای دیگراتان جستجو کنید.


using (var strm = new System.IO.StreamWriter("C:\\file.txt", false, System.Text.Encoding.UTF8))
{
strm.Write("سلام");
'strm.Flush();
}

(اگر از VS در زمان Save پروزه پیغامی نشان داد که فرمت متنی کدها صحیح نیست، انها را به UTF-8 تنظیم و OK کنید.)

اگر خوااستید بخشی از کدهایتان را قرار دهید تا بتوان ایرادش را مشخص کرد ولی همینطوری چشم بسته نمیتوانم کمک دیگری بکنم.

Arshia001
03-09-2009, 10:27
من یه فایل دارم با این فرمت:

hh:mm:ss.Text

که برای زیرنویس فیلمه.این فایلو خود برنامه میسازه.بعد میخوام ازش یه فایل SRT تولید کنم،که از این کد استفاده میکنم:


Dim I As New IO.StreamReader(Filename + ".tmp")
Dim O As New IO.StreamWriter(Filename)
Dim Ind As Integer = 0
Dim Cur, Nxt As New SubItemStruct
ReadEntry(I, Cur)
While Not I.EndOfStream
ReadEntry(I, Nxt)
If Cur.Text <> "" And Cur.Text <> " " Then
Ind += 1
O.WriteLine(Ind.ToString)
O.WriteLine(Cur.Time.ToString + " --> " + Nxt.Time.ToString)
O.WriteLine(Cur.Text)
O.WriteLine("")
End If
Cur = Nxt
End While
O.Close()
I.Close()


فایل های SRT این شکلی هستن:

n
hh:mm:ss.ddd --> hh:mm:ss.ddd
Text

فرمتش رو با Notepad از UTF-8 عوض میکنم به Unicode.

_H2_
03-09-2009, 11:12
سلام
خوب فرمت را از اول روی Unicode بگذارید!
من گفتم شما میتوانید از لیست فرمتها هر موردی را انتخاب کنید.
Ascii و utf8 و unicode و...

به جای Close اگر بتوانید دستور Using بهتر است و با توجه به چند مورد ریز سرعت و کارایی و... من کد شما را چنین اصلاح کردم و پیشنهاد میکنم این را تست کنید:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

Arshia001
03-09-2009, 23:22
البته یه تعدادی از اون WriteLine ها باید Write باشن.همین الآن امتحانش میکنم.

----------

کاملا درست کار کرد.احتمالا از همون False اضافی توی پارامتر های نیو باید باشه.خیلی ممنون.

تابع String.IsNullOrEmpty رشته هایی که فقط کاراکتر فاصله داشته باشن رو خالی حساب میکنه،درسته؟من توی قسمت اول کد(قبل از اضافه کردن فرمت SRT) از یه فاصله برای خط خالی استفاده کردم.

----------

نه،رشته هایی که کاراکتر فاصله داشته باشن رد میکنه.بنابراین باید از همون شرط خودم استفاده کنم.

_H2_
04-09-2009, 12:44
سلام
تابع String.IsNullOrEmpty کار شرط خودتان را انجام میدهد و مطمئن تر از شرط شما است، چون دو بار چک میکند.
یکبار Nothing بودن را چک میکند و یک بار Empty بودن.
(درحالی که شرط شما فقط Empty را چک میکند.)

تابع فوق رشته دارای فاصله را پر درنظر میگیرید مثل سایر رشته ها.
(با دستور Trim میتوانید فواصل ابتدا و انتهای رشته را حذف کنید.)

بحرحال شرط خودتان را پیشنهاد نمیکنم.

تابه فوق با شرط زیر برابر است:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

Arshia001
05-09-2009, 13:58
فاصله ها ممکنه لازم باشه اطراف رشته ها.مطمئن هم هستم که هیچ رشته ای Nothing نیست،چون مقدار بازگشتی تابع InputBox حتما یه رشته است.با این شرایط باز هم همین تابع رو توصیه میکنین؟چرا؟

_H2_
05-09-2009, 15:12
سلام

نیست،چون مقدار بازگشتی تابع InputBox حتما یه رشته است
1-
کار از محکم کاری عیب نمیکنه! چه قدر پیغام خطای Null refrence دید؟

به خاطر همین اطمینان ها است که خیلی از برنامه ها در موارد حساس و خاص و یک شرایط پیشبینی نشده یک دفعه خطا میخورند و error میدهند.
اطمینان Nothing نبودن! اطمینان انکه مسیر پوشه اخرش اسلش دارد! اطمینان انکه فایلی وجود دارد! اطمینان انکه فایلی وجود ندارد! اطمینان ... !

این هم بد نیست:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


2-
دو دستور زیر از نظر بازدهی برابر نیستد

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

پس حداقل اگر هم خواستید بهتر است از دستور دوم استفاده کنید.

Arshia001
05-09-2009, 23:46
خوب من هم حداقل یه کوچولو از این مشکلاتو باهاش روبرو شدم،ولی هنوز هم هیچ کدوم این دستور ها اون رشته ی یک فاصله " " منو نمیگیرن!البته خودم خیلی خوشم نمیومد از فاصله به جای خط خالی استفاده کنم،ولی فرمت های زیرنویس که فقط اول هر خط رو مشخص میکنن و آخرش اول خط بعدیه،خط کاملا خالی رو آدم حساب نمیکنن.مجبور بودم این فاصله هه رو بذارم،حالا هم شده دردسر...

_H2_
05-09-2009, 23:57
سلام
یک چیز کوچک را باید بگم.
در کد شما من آن فاصله را ندیده بودم، یعنی " " شما را فکر کردم "" نوشته اید!!!
چیزهایی که من گفتم فقط برای معادل نویسی شرط "" بوده.

Arshia001
06-09-2009, 09:46
از اون لحاظ...!
به هر حال،از کمکتون ممنونم.