อ่านข้อมูล text file....ผมติดปัญหาเรื่องของการอ่านข้อมูล text file ซึ่งผมต้องการเก็บข้อมูลเลขที่บัตรประชาชน
ทำไมไม่ทำให้ข้อมูลแยกบรรทัดกันล่ะคับ จะได้อ่านได้ง่ายขึ้น
Date :
2010-06-17 16:48:27
By :
anucham
regular expression ช่วยท่านได้ครับ
ปล. ไม่ต้องถามต่อนะว่าใช้ยังไง เพราะจะให้ไปศึกษาเอาเอง
Date :
2010-06-17 16:58:39
By :
tungman
ไม่เข้าใจค่ะพี่ตึ๋ง
Date :
2010-06-17 18:39:24
By :
blurEyes
เอาอีกแล้วรึท่าน
มันมีสองส่วนที่ต้องเก็บใช่ไหม คือ citizen id กับ เงิน
ขั้นแรกก็ต้อง split ก่อนโดยการใช้ ' ' space จะได้ array of string
เอาไปวนลูป ส่งไปตรวจสอบว่าอันไหนเป็น citizen id หรือ เงิน
โดย citizen id ใช้ method ตรวจสอบเลขบัตรประชาชน
และเงินให้ใช้ regular expression
แต่ต้องตรวจสอบทั้งสองอันนะ
Date :
2010-06-17 19:46:08
By :
tungman
ข้อมูลตรวจสอบยาก ต้องตำหนิคนส่งข้อมุลมาค่ะไม่ได้คิดเผื่อเหลือเผื่อขาดไว้เลย
ถ้าเพียงแต่ใส่ separator อย่าง ; หรือ | เพื่อแยก field ออกมาให้ง่ายงานนี้ใช้ code ไม่กี่บรรทัด
ไม่อยากบ่น เหมือนสักแต่ว่าเขียนให้จบๆพ้นๆภาระของตัวเอง
คนมารับงานต่อซวยดิคะ เซลสมองเสื่อมเอาง่ายๆ
Date :
2010-06-17 20:05:05
By :
blurEyes
หุหุ ท้าทายดีออก สมองยิ่งลับยิ่งคม แต่บ่อยๆ มีด่า
Date :
2010-06-17 20:10:29
By :
tungman
ใช่สี้ พราวไม่ใช่คนใจดีนี้ ด่าก่อนแหละค่ะ ถูกผิดว่ากันอีกที
Date :
2010-06-17 20:24:13
By :
blurEyes
ผมขอตัวอย่างซัก 1 ตัวอย่างได้ไหมครับ เพราะ งง จริงๆ ครับ
Date :
2010-06-17 22:08:16
By :
เด็กหัดเขียน
งั้นเขียนโค้ดอ่าน textfile มาดูให้ชื่นใจหน่อยดิ๊
อ่านแบบทีละแถวนะ
Date :
2010-06-17 22:43:41
By :
tungman
Code (VB.NET)
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim line As String
Dim fInfo As New FileInfo("c:\MAEJO2.txt")
Dim reader As StreamReader = fInfo.OpenText()
While (InlineAssignHelper(line, reader.ReadLine())) IsNot Nothing
Response.Write(line & "<br>")
End While
Console.ReadLine()
End Sub
ช่วยเขียนตัวอย่างให้ผมดู ซัก ตัวอย่างด้วยครับ ทำมาหลายวันแล้วไม่ได้จริงๆ
Date :
2010-06-17 22:46:32
By :
เด็กหัดเขียน
text file ตัวอย่าง เป็น file การชำระเงินที่ธนาคารส่งมาให้ ผมต้องการแยกออกเป็นส่วน ๆ แต่พอดูชนาดความยาว และ format ไม่เหมือนกัน ผมไม่รู้จะทำยังไงแล้วครับ อยากให้ผู้รู้ช่วยหน่อยครับ ขอบคุณล่วงหน้าครับเ
Date :
2010-06-17 22:52:38
By :
เด็กหัดเขียน
เอาตัวอย่าง text file มาซัก 20 บรรทัดซิ เอาแบบที่มันต่างกันเยอะๆ นะ
อย่าลืม bold ส่วนที่จะเก็บให้ด้วย เพราะตรงเงินนี้ถ้าไม่จับด้วย length ไม่มีทางอื่นเลย
ให้ทำด้วยมือยังเอ๋อ เพราะไม่รู้ว่าจะตัด 0 ข้างหลังไปกี่ตัว
Date :
2010-06-17 23:41:32
By :
tungman
ก็อบ text file แล้ว encode เป้น utf-8
FileReader.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="FileReader.aspx.cs" Inherits="FileReader" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>Read Text File</title>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:FileUpload ID="FileUpload1" runat="server" />
<asp:Button ID="ReadButton" runat="server" Text="Read" />
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ErrorMessage="file path is empty." ControlToValidate="FileUpload1"></asp:RequiredFieldValidator>
<br />
<br />
<asp:GridView ID="GridView1" runat="server">
</asp:GridView>
</div>
</form>
</body>
</html>
FileReader.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
public partial class FileReader : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
ReadButton.Click += new EventHandler(ReadButton_Click);
FilterExtension();
FileUpload1.Attributes.Add("onchange", "return checkFileExtension(this);");
}
protected void ReadButton_Click(object sender, EventArgs e)
{
if (FileUpload1.HasFile)
{
DataTable Dt = new DataTable();
Dt.Columns.Add(new DataColumn("RowIndex", typeof(int)));
Dt.Columns.Add(new DataColumn("CitizenID", typeof(string)));
Dt.Columns.Add(new DataColumn("Name", typeof(string)));
Dt.Columns.Add(new DataColumn("Money", typeof(double)));
Stream stream = FileUpload1.PostedFile.InputStream;
using (StreamReader reader = new StreamReader(stream))
{
int rowIndex = 0;
while (reader.Peek() >= 0)
{
string citizenID = string.Empty;
string money = string.Empty;
string aLine = reader.ReadLine();
string[] textArray = aLine.Split(' ');
foreach (string aText in textArray)
{
if (VerifyCitizenID(aText) && citizenID == string.Empty)
citizenID = aText;
if (VerifyMoney(aText) && money == string.Empty)
money = aText.Substring(0, aText.Length - 5).Substring(26);
}
string t = string.Empty;
if (textArray.Length > 2)
{
char[] a = textArray[2].ToCharArray();
if (a.Length > 0)
t = (Char.IsNumber(a[0])) ? string.Empty : " " + textArray[2];
}
DataRow Dr = Dt.NewRow();
Dr["RowIndex"] = ++rowIndex;
Dr["CitizenID"] = (citizenID != string.Empty) ? citizenID : "not found";
Dr["Name"] = (textArray[0].Length > 34) ? textArray[0].Substring(34) + " " + textArray[1] + t: "not found";
Dr["Money"] = (money != string.Empty) ? double.Parse(money) : 0.0d;
Dt.Rows.Add(Dr);
}
}
GridView1.DataSource = Dt;
GridView1.DataBind();
}
}
private bool VerifyCitizenID(string citizenID)
{
//ตรวจสอบว่าทุก ๆ ตัวอักษรเป็นตัวเลข
if (citizenID.ToCharArray().All(c => char.IsNumber(c)) == false)
return false;
//ตรวจสอบว่าข้อมูลมีทั้งหมด 13 ตัวอักษร
if (citizenID.Trim().Length != 13)
return false;
int sumValue = 0;
for (int i = 0; i < citizenID.Length - 1; i++)
sumValue += int.Parse(citizenID[i].ToString()) * (13 - i);
int v = 11 - (sumValue % 11);
return citizenID[12].ToString() == v.ToString();
}
private bool VerifyMoney(string moneyString)
{
string momeyPattern = "^[0-9]{8}[a-zA-Z]{4}[0-9]{23}";
Regex momeyCaseRegex = new Regex(momeyPattern);
Match momeyMatch = momeyCaseRegex.Match(moneyString);
return (momeyMatch.Value != string.Empty) ? true : false;
}
private void FilterExtension()
{
StringBuilder javaScriptBuilder = new StringBuilder();
javaScriptBuilder.Append(@"function checkFileExtension(elem) {
var filePath = elem.value;
if(filePath.indexOf('.') == -1) {
elem.value = '';
return false;
}
var validExtensions = new Array();
var ext = filePath.substring(filePath.lastIndexOf('.') + 1).toLowerCase();
validExtensions[0] = 'txt';
//validExtensions[0] = 'jpg';
//validExtensions[1] = 'jpeg';
//validExtensions[2] = 'bmp';
//validExtensions[3] = 'png';
//validExtensions[4] = 'gif';
//validExtensions[5] = 'tif';
//validExtensions[6] = 'tiff';
//validExtensions[7] = 'txt';
//validExtensions[8] = 'doc';
//validExtensions[9] = 'xls';
//validExtensions[10] = 'pdf';
for(var i = 0; i < validExtensions.length; i++) {
if(ext == validExtensions[i]) {
return true;
}
}
alert('The file extension ' + ext.toUpperCase() + ' is not allowed!');
elem.value = '';
return false;
}");
ClientScriptManager ClientScript = Page.ClientScript;
if (!ClientScript.IsClientScriptBlockRegistered(this.GetType(), "FilterExtension"))
ClientScript.RegisterClientScriptBlock(this.GetType(), "FilterExtension", javaScriptBuilder.ToString(), true);
}
}
Date :
2010-06-18 09:44:20
By :
tungman
หูย ทำไม citizen id มัน error เกือบครึ่งละเนี่ย
function ตรวจสอบของผมใช้ได้นะ เพราะผมเอา id ตัวเองทดสอบแล้ว
ลองตรวจ foramt ของ citizen id ใน text file ดูนะว่ามันใช่หรือเปล่า
ปล. ผมเข้าใจว่า อันที่ไม่มีชื่อ เลขบัตรมันจะไม่ถูก format นะ
ปล.2 โค้ดด้านบนเป็นตัวไฟนอลแล้ว สามารถทำการแยกชื่อและนามสกุลได้แล้วนะจ๊ะ โปรดก็อบไปวางใหม่เพื่อความเท่ได้เลย [วันนี้ 10:48]
Date :
2010-06-18 09:48:17
By :
tungman
อ๋อ fixlength record แล้วไป นึกว่า ชื่อไม่มีจะยุบ field เข้ามา
งั้นก้อน่าจะง่ายละ ต้องโทษคนเอามาโพสให้ข้อมูลไม่ครบ
ดีนะพี่ตึ๋งใจดี หุหุ
Date :
2010-06-18 10:55:10
By :
blurEyes
อืม แล้วก็ไม่บอกว่าเป็น fix length -_-"
เล่นซะต้องใช้ regular expression เลย
ทำตั้งแต่เมื่อคืน เพิ่งจะเห็น data ตอนเช้า
ไม่งั้นก็ใช้ substring กับ trim ก็จบแล้ว
Date :
2010-06-18 11:03:53
By :
tungman
อะดิคะ แล้วรหัสบัตรประชาชน ที่ error ไม่แปลกค่ะ
ให้เดานะคะ ที่ error อะ บัตรข้าราชการ เพราะความยาวไม่เท่ากันค่ะ
ทีหลังจะเอาข้อมูลมาโพส ให้มันครบๆมั่งนะคะ
เรื่อง่ายกลายเป็นยากละนะเนี่ย
Date :
2010-06-18 12:10:04
By :
blurEyes
พี่พอจะมีแบบที่ใช้ vb เขียนไหมครับ
Date :
2010-06-18 13:11:21
By :
เด็กหัดเขียน
ดู ปราดเดียวก็รู้ว่า Fix Length - Format 80
(Format เก่าสุดๆละ)
ที่แถวยาวไม่เท่ากัน เพราะภาษาไทย มันไม่ได้นับ Character เหมือนภาษาอังกฤษเท่านั้นเอง
อย่าไปว่าคนส่งข้อมูลเลย มันอยู่ที่ชั่วโมงบินเหมือนกันนะ คนส่งข้อมูลคงไม่ฉลาดเท่าพวกพี่นี่ เลยไม่รู้ว่าต้องแจ้งอะไรบ้าง หุหุ
Date :
2010-08-10 23:24:06
By :
วัยรุ่น
สอบถามเพิ่มเติมค่ะ ลองนำ code ด้านบนไปใช้งาน แต่ติด error ตรง บรรทัดนี้ค่ะ
if (citizenID.ToCharArray().All(c => char.IsNumber(c)) == false)
มันขึ้น Error ว่า 'System.Array' does not contain definition for 'All'
รบกวนช่วยอธิบายทีนะค่ะ ติดมา 2 วันแล้วไม่รู้จะแก้ยังไงค่ะ
ขอบคุณค่ะ
Date :
2010-08-30 14:53:37
By :
chabe47
ใข้ visual studio version ไหมครับ ???
Date :
2010-08-30 15:38:47
By :
tungman
ใช้ 2005 ค่ะ
Date :
2010-08-30 16:52:34
By :
chabe47
ถ้า 2005 ต้องหา linq มาลงครับ
ไม่งั้นต้องวนลูปต้องสอบ char ทีละตัวเอา
หรือลง 2008 ขึ้นไปครับ
Date :
2010-08-30 16:58:32
By :
tungman
Load balance : Server 03