PDA

View Full Version : سوال: تبدیل فایل text به SQL از طریق کد



lotus707
شنبه 04 آذر 1391, 20:12 عصر
درود به دوستان
من می خوام تو برنامه ای که با سی شارپ می نویسم اطلاعاتی که تو فایل های txt دارم به وسیله کد به طور خودکار به جدول Sql بفرستم، یه نفر بهم گفت این کار رو با کدهای vb انجام داده ولی متاسفانه دسترسی به اون کدها ندارم مطمئنم نیستم همچین کاری شدنی هست یا نه چون هرچی سرچ فارسی و انگلیسی کردم نتیجه ای نگرفتم(شاید باید بیشتر بگردم:لبخند:) اگه کسی می تونه منو راهنمایی کنه ممنون میشم اگه منبع انگلیسی هم برای این کار میشناسین بهم معرفی کنین خیلییییی زیاد ممنون میشم

Mozhdeh.Hemati
شنبه 04 آذر 1391, 22:28 عصر
سلام،

اگر منظورت رو درست متوجه شده باشم، فکر نمیکنم این کار سختی باشه!

مراحل مورد نیاز:
1- باز کردن فایل متنی و خواندن تمام سطر های آن --> System.IO.File.ReadAllLines
2- اتصال به پایگاه داده و وارد کردن سطرها در جدول --> SqlConnection, SqlCommand
3- تمام! حالا کدوم مرحله رو مشکل داری!؟

veniz2008
شنبه 04 آذر 1391, 23:18 عصر
درود به دوستان
من می خوام تو برنامه ای که با سی شارپ می نویسم اطلاعاتی که تو فایل های txt دارم به وسیله کد به طور خودکار به جدول Sql بفرستم
سلام. ببینید فایل تکست شما باید یه سری قواعد رو درونش رعایت کرده باشید. یکی اینکه فیلدهای جدولت باید با یک سمبل خاص از هم جدا بشن( مثلا ; برای اینکه فیلدها رو تمایز بدیم) و دوم اینکه رکوردها رو هم با یک سمبل خاص از هم جدا کنید ( مثلا / برای نشان دادن پایان یک رکورد). بعدش کافیه با تابع split اول رکوردها رو مجزا می کنیم و بعد دوباره بر روی رکورد همین کار رو انجام بدیم تا فیلدها رو بدست بیاریم.

lotus707
یک شنبه 05 آذر 1391, 11:44 صبح
من چند فایل text دارم که دقیقا همین طوری که شما فرمودید، فیلدها با علامت کاما( , ) از هم جدا شدند و انتهای هر رکورد هم با اینتر از رکورد بعدی مجزا هست فقط مسئله اینجاست که چون تا به حال این کار رو انجام ندادم دنبال یک کتاب هستم که گام به گام انجامش بدم، اگه منبع خاصی مدنظرتون هست ممنون میشم بهم معرفی کنین.بازم ممنونم از محبتتون:لبخندساده:

veniz2008
یک شنبه 05 آذر 1391, 13:09 عصر
نیاز به کتاب ندارید. مراحل کار بسیار ساده هستش. مراحل کار رو به همراه کدها شرح میدم:
فرض کنید فایل text شما اسمش test.txt و برای جدا کردن فیلدها از ; و برای جدا کردن رکوردها از + استفاده کرده باشید.
ابتدا
using System.IO; رو به بالای فرم اضافه کنید.
این مثال برای 3 فیلد id و name و family هست. برای این کار یه دیتابیس به نام test ساختم و سه فیلد id ( از نوع int )،و name ( از نوع nvarchar ) و family ( از نوع nvarchar ) در قالب جدولی به نام person ایجاد کردم. این فیلدها و نوع اونها رو طبق اطلاعات فایل text میسازیم. ادامه مراحل کار بصورت زیر هست :
درون دکمه ای که برای اضافه کردن فایل text به دیتابیس دارید این کدها رو بنویسید:

StreamReader sr = new StreamReader("d:\\test.txt");
string allchar = sr.ReadToEnd();
sr.Close();
string[] records = allchar.Split('+');
for (int i = 0; i < records.Length; i++)
{
string[] field = records[i].Split(';');
SqlConnection con = new SqlConnection("data source = .\\md2008;initial catalog = test;integrated security = true");
SqlCommand cmd = new SqlCommand("insert into person values (@id,@name,@family)", con);
cmd.Parameters.AddWithValue("@id", field[0]);
cmd.Parameters.AddWithValue("@name",field[1]);
cmd.Parameters.AddWithValue("@family", field[2]);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
نکته : اگر از \ برای جدا کردن رکوردها استفاده کردید از \\ باید استفاده کنید. یعنی بایستی اینطور بنویسید :

string[] records = allchar.Split('\\');

lotus707
یک شنبه 05 آذر 1391, 22:39 عصر
با عرض پوزش، اگه بخوام به جای کاراکتر + رکوردهامو با اینتر از هم جدا کنم باید چه کار کنم؟ :لبخند:چون تو فایل اصلی که می خوام تبدیل بشه رکورد ها با اینتر از هم جدا شدن. مممنووووووووونم:لبخندساده:

veniz2008
یک شنبه 05 آذر 1391, 23:21 عصر
کاری نکردم. خوشحالم از اینکه مشکلتون حل شده.جواب سوالتون خیلی راحته. کافیه 'n\' رو به جای '+' قرار بدید.

ali_general
چهارشنبه 09 اسفند 1391, 09:03 صبح
نیاز به کتاب ندارید. مراحل کار بسیار ساده هستش. مراحل کار رو به همراه کدها شرح میدم:
فرض کنید فایل text شما اسمش test.txt و برای جدا کردن فیلدها از ; و برای جدا کردن رکوردها از + استفاده کرده باشید.
ابتدا
using System.IO; رو به بالای فرم اضافه کنید.
این مثال برای 3 فیلد id و name و family هست. برای این کار یه دیتابیس به نام test ساختم و سه فیلد id ( از نوع int )،و name ( از نوع nvarchar ) و family ( از نوع nvarchar ) در قالب جدولی به نام person ایجاد کردم. این فیلدها و نوع اونها رو طبق اطلاعات فایل text میسازیم. ادامه مراحل کار بصورت زیر هست :
درون دکمه ای که برای اضافه کردن فایل text به دیتابیس دارید این کدها رو بنویسید:

StreamReader sr = new StreamReader("d:\\test.txt");
string allchar = sr.ReadToEnd();
sr.Close();
string[] records = allchar.Split('+');
for (int i = 0; i < records.Length; i++)
{
string[] field = records[i].Split(';');
SqlConnection con = new SqlConnection("data source = .\\md2008;initial catalog = test;integrated security = true");
SqlCommand cmd = new SqlCommand("insert into person values (@id,@name,@family)", con);
cmd.Parameters.AddWithValue("@id", field[0]);
cmd.Parameters.AddWithValue("@name",field[1]);
cmd.Parameters.AddWithValue("@family", field[2]);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
نکته : اگر از \ برای جدا کردن رکوردها استفاده کردید از \\ باید استفاده کنید. یعنی بایستی اینطور بنویسید :

string[] records = allchar.Split('\\');


با سلام
واقعاً خیلی خوب بود
منم همچین مشکلی داشتم که حل شد

فقط یه مشکل کوچیک که اگه کمکم کنید ممنون میشم چطور می تونم بین فیلدهایی که از فایل text می خوام وارد جدول کنم فقط بعضی فیلهامو بیارم
یعنی در واقع من توی فایل متنی که دارم به همه اطلاعات تو یک خط احتیاج ندارم

مثلاً یک خط از فایل متنی من هست :
04,254584,2155411,25488,36511
همانطور که میبینید فیلدهای من با علامت کاما از هم جدا شده اند
حالا من فقط می خوام فیلد 1 و فیلد 3 و فیلد آخر رو وارد یک جدول تو دیتا بیسم بکنم
چطور اینها رو از هم تفکیک کنم
ممنون میشم کمکم کنید........

ali_general
چهارشنبه 09 اسفند 1391, 11:08 صبح
اوکی دوستان عزیز خودم تونستم درستش کنم....
مرسی

babak23
جمعه 08 شهریور 1392, 00:02 صبح
با سلام من يه فايل متني دارم با حجم 35 مگا بايت اطلاعات اين فايل متني را ميتونم از طريق ويزارد اسكول به جداول اسكول سرور تبديل كنم و ......... اما من بيشتر دنبال كد سورسي هستم كه تو برنامه مبتني بر سي شارپ بتونه اين كار را به سرعت انجام بده يك روش خوندن فايل متني و ذخيره به صورت ركود به ركود هست اما با توجه به حجم فايل سرعت خيلي كندي خواهد داشت و معقولانه نيست عزيزان كسي هست كه بتونه كد سورس يا روش بهتري را ارائه بده كه بشه از طريق برنامه فايل هاي متني را به جداول هاي اسكول تبديل كرد با سرعت بالا :چشمک:

veniz2008
جمعه 08 شهریور 1392, 00:32 صبح
با سلام من يه فايل متني دارم با حجم 35 مگا بايت اطلاعات اين فايل متني را ميتونم از طريق ويزارد اسكول به جداول اسكول سرور تبديل كنم و ......... اما من بيشتر دنبال كد سورسي هستم كه تو برنامه مبتني بر سي شارپ بتونه اين كار را به سرعت انجام بده يك روش خوندن فايل متني و ذخيره به صورت ركود به ركود هست اما با توجه به حجم فايل سرعت خيلي كندي خواهد داشت و معقولانه نيست عزيزان كسي هست كه بتونه كد سورس يا روش بهتري را ارائه بده كه بشه از طريق برنامه فايل هاي متني را به جداول هاي اسكول تبديل كرد با سرعت بالا :چشمک:
سلام.
دلیل اینکه این روش، کند هست اینه که به ازای هر رکورد موجود در آرایه، یکبار کانکشن باز و بسته میشه که در رکوردهای زیاد به شدت سرعت رو میاره پایین. برای رفع این مشکل رکوردها رو درون یک حلقه با هم جمع بزنید و بعد در خارج از حلقه با یک بار وصل شدن به دیتابیس عمل درج رو انجام بدید.
یه نمونه اش بصورت زیر هست که البته بهتره اونو به پارامترها تبدیل و استفاده کنید :

for (int i = 0; i < datagridview1.Rows.Count ; i++)
{
s = s + "insert into student2 values(" + dataGridView1.Rows[i].Cells[0].Value + ",'" + dataGridView1.Rows[i].Cells[1].Value + "',N'" + dataGridView1.Rows[i].Cells[2].Value + "',N'" + dataGridView1.Rows[i].Cells[3].Value + "')" + ";";
}
s = s.Remove(s.Length - 1, 1);
con = new SqlConnection("Data source =(local);initial catalog = testgrid;integrated security = true");
con.Open();
SqlCommand cmd = new SqlCommand(s, con);
cmd.ExecuteNonQuery();
con.Close();

مهرداد صفا
جمعه 08 شهریور 1392, 10:44 صبح
با سلام من يه فايل متني دارم با حجم 35 مگا بايت اطلاعات اين فايل متني را ميتونم از طريق ويزارد اسكول به جداول اسكول سرور تبديل كنم و ......... اما من بيشتر دنبال كد سورسي هستم كه تو برنامه مبتني بر سي شارپ بتونه اين كار را به سرعت انجام بده يك روش خوندن فايل متني و ذخيره به صورت ركود به ركود هست اما با توجه به حجم فايل سرعت خيلي كندي خواهد داشت و معقولانه نيست عزيزان كسي هست كه بتونه كد سورس يا روش بهتري را ارائه بده كه بشه از طريق برنامه فايل هاي متني را به جداول هاي اسكول تبديل كرد با سرعت بالا :چشمک:

با سلام.
بهترین راه برای شما import مستقیم داده ها توسط خود سرور با استفاده از فرمان bulk insert (http://technet.microsoft.com/en-us/library/ms188365.aspx) است. شما می توانید در ساده ترین شکل این فرمان را به شکل زیر استفاده کنید:


bulk insert from 'c:\text.txt' with (FieldTerminator=',',RowTerminator='\')

در مثال زیر ابتدا یک جدول به نام test1 و با دوفیلد Id و name ساخته می شود. یک سری اطلاعات تصادفی در یک فایل متنی می نویسیم و سپس اطلاعات فایل متنی را در جدول وارد می کنیم.
مثال:

//بسم الله الرحمن الرحیم
//اللهم صل علی محمد و آل محمد


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Data.SqlClient;

namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
const string TextFileName = "e:\\temp\\Data.txt";
const string FieldSeparator = ",";
const string RowSeparator = "\\";
const string ConnectionString="server=.\\SqlExpress;integrated security=true;";

public Form1()
{
InitializeComponent();
using (SqlConnection connection = new SqlConnection(ConnectionString))
{
using (SqlCommand command = new SqlCommand("", connection))
{
Action<string> execute = sql => { command.CommandText = sql; command.ExecuteNonQuery(); };
connection.Open();
execute("if(exists(select * from sys.tables where name='test1')) drop table test1;");
execute("create table test1(ID int identity,name NVarChar(100));");


//inserting random data into text file...

using (StreamWriter writer = new StreamWriter(TextFileName))
{
Random rand = new Random();
for (int i = 0; i <= 1000; i++)
{
writer.Write(i.ToString() + FieldSeparator +
((char)rand.Next(65, 92)).ToString() + RowSeparator);
}
writer.Close();
}
execute(string.Format( "bulk insert dbo.test1 from '{0}' with (FieldTerminator='{1}',RowTerminator='{2}');",TextFileName,FieldSeparator,RowSeparator));
command.CommandText = "select * from test1";
dataGridView1.DataSource = new DataTable();
(dataGridView1.DataSource as DataTable).Load(command.ExecuteReader());
connection.Close();
}//end use of command
} //end use of connection
}



}
}

ali_general
پنج شنبه 14 شهریور 1392, 08:20 صبح
با سلام خدمت دوستان عزیزم

من یک فایل متنی دارم که یک سطر آن به شکل زیر است

121214،121215441،0151،920615

یعنی متشکل از چندین سطر به شکل بالا می باشد

خب حالا من یک پایگاه داده دارم که جدولی به نام کدینگ دارد که شامل تمام کد های بالا و همچنین اسم مربوط به آن کد است مثلا کد 121214 نماد اسم حسین است .

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

خیلی فوریه خیلی ممنون میشم کمکم کنید

hiiva1
سه شنبه 14 مرداد 1393, 09:52 صبح
کاری نکردم. خوشحالم از اینکه مشکلتون حل شده.جواب سوالتون خیلی راحته. کافیه 'n\' رو به جای '+' قرار بدید.

برای جدا شدن داخل فایل من :: استفاده شده. وقتی اینو '::' میذارم خطا میده. باید چیکارش کنم؟

veniz2008
سه شنبه 14 مرداد 1393, 12:56 عصر
برای جدا شدن داخل فایل من :: استفاده شده. وقتی اینو '::' میذارم خطا میده. باید چیکارش کنم؟
داخل تک کوتیشن نمیشه رشته (::) قرار داد. شما برای رفع مشکلتون از کد زیر استفاده کنید :

string[] myfilter = new string[] {"::"};
string[] records = allchar.Split(myfilter,StringSplitOptions.None);
موفق باشید.

mehregan alinia
شنبه 18 مرداد 1393, 23:23 عصر
سلام خدمت تمام دوستان گلم : من تو یه اداره دولتی کار میکنم حجم تراکنشش بانکی زیاده و از طریق صورتحساب بانکی به صورت تکس کنترل حساب رو انجام میدهیم و میخواستم بدونم اطلاعات ما به صورت تکس است و به صورت ماهیانه است . اگر بخواهیم ماه بعد اطلاعات جدید رو از دنباله اطلاعات قبلی اضافه کنیم نحوه کد نویسی به چه صورت است .
shomarehesab tarikh mablagh sharh

alonmahdi
شنبه 18 مرداد 1393, 23:40 عصر
سلام خدمت تمام دوستان گلم : من تو یه اداره دولتی کار میکنم حجم تراکنشش بانکی زیاده و از طریق صورتحساب بانکی به صورت تکس کنترل حساب رو انجام میدهیم و میخواستم بدونم اطلاعات ما به صورت تکس است و به صورت ماهیانه است . اگر بخواهیم ماه بعد اطلاعات جدید رو از دنباله اطلاعات قبلی اضافه کنیم نحوه کد نویسی به چه صورت است .
shomarehesab tarikh mablagh sharh

یکم گنگ توضیح دادید میشه یک مثال بیارید یا تصویری ضمیمه کنید؟

mehregan alinia
یک شنبه 19 مرداد 1393, 22:11 عصر
اطلاعات صورتحساب ما به صورت ماهیانه و به صورت اینترنت دریافت میکنیم که شامل ۴۰۰ رکورد در ماه است , که میخواهیم برای راحتی کار اطلاعات تکست این صورتحساب رو به صورت یکجا به بانک اطلاعاتی اسکیوال انتقال بدهیم , حال میخواستم یک راهنمایی بدید چطور میشود این اطلاعات را طریق کد نویسی در سی شارپ به اسکیوال انتقال بدهیم و طلاعات تکست صورتحساب بانکی ماههای بعد را به ترتیب از آخرین اطلاعات ذخیره شده ماه قبل وارد کنیم و مشکلی پیش نیاید .
ستونهای ما در صورتحساب
Tarikh;mablagh;ghabz;nam
فایل یکماهه به این صورت است و هر ماه این تعداد تراکنش داریم میخواستم بدونم چطور ما میتونیم با کد نویسی در سی شارپ به صورت یکجا این رکوردها را به اسکیو ال انتقال بدیم و مهمتر اینکه چطور میتونیم ماههای بعد را هم از آخر این اظلاعات ذخیره شده اضافه نماییم

مبلغ|توضیحات|شرح|شماره حساب|
17135455600733| نقدي |740978 |44400.0000|
17135455600733| نقدي |223080 |60000.0000|
17135455600733| نقدي |223081 |56670.0000|
17135455600733| نقدي |740913 |50000.0000|
17135455600733| نقدي |740914 |50000.0000|
17135455600733| نقدي |740915 |57700.0000|
17135455600733| نقدي |740979 |50000.0000|
17135455600733| نقدي |740980 |50000.0000|
17135455600733| نقدي |740991 |50000.0000|
17135455600733| نقدي |223082 |50000.0000|
17135455600733| نقدي |223083 |50000.0000|
17135455600733| نقدي |740990 |50000.0000|
17135455600733| نقدي |740989 |54890.0000|
17135455600733| نقدي |740918 |50000.0000|
17135455600733| نقدي |740917 |50000.0000|
17135455600733| نقدي |740916 |50000.0000|
17135455600733| نقدي |223053 |50000.0000|
17135455600733| نقدي |223074 |50000.0000|
17135455600733| نقدي |740982 |32900.0000|
17135455600733| نقدي |223055 |50000.0000|
17135455600733| نقدي |223057 |50000.0000|
17135455600733| نقدي |223059 |50000.0000|
17135455600733| نقدي | نقدي |223037 |50000.0000|
17135455600733| نقدي |740983 |50000.0000|
17135455600733| نقدي |740985 |50000.0000|
17135455600733| نقدي |740984 |50000.0000|
17135455600733| نقدي |740986 |50000.0000|
17135455600733| نقدي |740987 |50000.0000|
17135455600733| نقدي |740988 |50000.0000|
17135455600733| نقدي |223039 |50000.0000|
17135455600733| نقدي |223084 |50000.0000|
17135455600733| نقدي |223065 |50000.0000|
17135455600733| نقدي |223040 |50000.0000|
17135455600733| نقدي |223064 |50000.0000|
17135455600733| نقدي |740850 |70500.0000|
17135455600733| نقدي |740849 |50000.0000|
17135455600733| نقدي |223062 |50000.0000|
17135455600733| نقدي |223063 |50000.0000|
17135455600733| نقدي |740848 |156000.000|
17135455600733| نقدي |740842 |50000.0000|