none
How can i split large size text file to many small text files ?

    Question

  • In this code sample im retriving text from a text file specific text and write it in to a new text file.

    Now i want for example after the new text file is finished to be written w.Close();

    I want to check that if the new text file size is over lets say 30kb then split the file to one file of 30kb and the rest in another file.

    And if its 300kb the new text file then split it to 10 files each of 30kb. Allways the first file 30kb and rest as much as needded.

    I also want that it will make tha for example splitted file 000001.txt will contain the text from the beginning file 000002.txt will start from the end of the first file and file number 000003.txt will start from where 000002.txt ended.

    Then i want in the end im doing something with the files and i want in the end to merge them all back to one big file in the order of 000001 then merge to it 000002 into the end of 000001 and so on so in the end ill have a new text file back with all the text as it was in the beginning.

     

    This is the retriving text code:

    private void retrivingText()
            {
                string startTag = "<Text>"; 
                string endTag = "</Text>"; 
                int startTagWidth = startTag.Length; 
                int endTagWidth = endTag.Length; 
                index = 0;
                w = new StreamWriter(@"d:\retrivedText.txt");
                while (true) 
                  { 
                    index = f.IndexOf(startTag, index); 
                    if (index == -1)  
                     { 
                      break;  
                     } 
                    // else more to do - index now is positioned at first character of startTag 
                   int start = index + startTagWidth; 
                   index = f.IndexOf(endTag, start+1); 
                   if (index == -1) 
                    { 
                     break;  
                    } 
                  // found the endTag 
                  string g = f.Substring(start, index - start);
                  w.WriteLine(g);
                  }
                w.Close();
            }
    

    Thanks.


    danieli
    Friday, October 14, 2011 9:32 PM

Answers

  • ... something to start with.

    Note: this is more or less air code, its written in a rush (for I must do some other things now out of the house...) and not really tested, so there may be better ways to do this and there surely will be a better error-handling be possible:

     

        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                string largeFile = @"C:\Users\...\Desktop\a.txt";
                string savePath = @"C:\Users\...\Desktop\SplittedFiles";
                bool b = SplitFiles(largeFile, 50, savePath);
            } 
            
            private void button2_Click(object sender, EventArgs e)
            {
                string savePath = @"C:\Users\...\Desktop\SplittedFiles";
                string newLargeFile = @"C:\Users\...\Desktop\SplittedFiles\AAAA.txt";
                bool b = CombineFiles(newLargeFile, savePath);
            }
    
            private bool SplitFiles(string largeFile, int numLines, string savePath)
            {
                bool bRet = false;
                if (File.Exists(largeFile))
                {
                    StreamReader sr = null;
                    StreamWriter sw = null;
                    try
                    {
                        Directory.CreateDirectory(savePath);
    
                        sr = new StreamReader(largeFile); 
                        int i = 0;
    
                        while (sr.Peek() != -1)
                        {
                            sw = new StreamWriter(Path.Combine(savePath, "File" + i.ToString("D4") + ".txt"));
                            sw.AutoFlush = true;
    
                            for (int j = 0; j < numLines; j++)
                            {
                                sw.WriteLine(sr.ReadLine());
    
                                if (sr.Peek() == -1)
                                    break;
                            }
    
                            i++;
    
                            sw.Close();
                        }
    
                        bRet = true;
                    }
                    catch
                    {
                        bRet = false;
                    }
                    finally
                    {
                        sr.Close();
                        sr = null;
    
                        sw.Close();
                        sw = null;
                    }
                }
    
                return bRet;
            }
    
            private bool CombineFiles(string newLargeFile, string savePath)
            {
                bool bRet = false;
    
                if (Directory.Exists(savePath))
                {
                    StreamReader sr = null;
                    StreamWriter sw = null;
    
                    try
                    {
                        List<FileInfo> fList = new List<FileInfo>();
                        fList.AddRange(new DirectoryInfo(savePath).GetFiles("*.txt").Where(a => a.FullName.ToLower().Equals(newLargeFile.ToLower()) == false).ToArray());
                        fList = fList.OrderBy(a => a.Name).ToList();
    
                        sw = new StreamWriter(newLargeFile);
                        sw.AutoFlush = true;
    
                        foreach (FileInfo fi in fList)
                        {
                            sr = new StreamReader(fi.FullName);
                            sw.Write(sr.ReadToEnd());
                            sr.Close();
                        }
                    }
                    catch
                    {
                        bRet = false;
                    }
                    finally
                    {
                        sr.Close();
                        sr = null;
    
                        sw.Close();
                        sw = null;
                    }
                }
    
                return bRet;
            }
        }

     

    Regards,  

      Thorsten



    Saturday, October 15, 2011 5:26 AM
  • ... and here's a size-based method that first reads the complete file:

            private void button1_Click(object sender, EventArgs e)
            {
                string largeFile = @"C:\Users\...\Desktop\a.txt";
                string savePath = @"C:\Users\...\Desktop\SplittedFiles";
                bool b = SplitFiles(largeFile, 1024 * 16, savePath);
            } 
    
            private bool SplitFiles(string largeFile, int preferredSize, string savePath)
            {
                bool bRet = false;
                if (File.Exists(largeFile))
                {
                    StreamReader sr = null;
                    StreamWriter sw = null;
                    try
                    {
                        Directory.CreateDirectory(savePath);
    
                        sr = new StreamReader(largeFile); 
                        char[] allchars = sr.ReadToEnd().ToCharArray();
                        sr.Close();
    
                        int i = 0;
                        int position = 0;
    
                        while (position < allchars.Length)
                        {
                            int l = Math.Min(preferredSize, allchars.Length - position);
                            sw = new StreamWriter(Path.Combine(savePath, "File" + i.ToString("D4") + ".txt"));
                            sw.AutoFlush = true;
    
                            char[] buffer = new Char[l];
                            Array.Copy(allchars, position, buffer, 0, l);
                            sw.Write(buffer);
    
                            position += l;
    
                            i++;
    
                            sw.Close();
    
                            bRet = true;
                        }
                    }
                    catch
                    {
                        bRet = false;
                    }
                    finally
                    {
                        sr.Close();
                        sr = null;
    
                        sw.Close();
                        sw = null;
                    }
                }
    
                return bRet;
            }
    

    Regards,

      Thorsten

    • Marked as answer by chocolade Saturday, October 15, 2011 10:20 AM
    Saturday, October 15, 2011 9:55 AM

All replies

  • For example if the original file was " hello world good day "  need to be splitted then file 000001.txt will contain " hello world " file 000002.txt will contain " good day "

    Then when i merge the files it will be: merged.txt " hello world good day "

    Again it suppose to be according to the retriving code i put up so it will split and merge if need to split using the retrived text in this function.

     


    danieli
    Friday, October 14, 2011 9:35 PM
  • I want to check that if the new text file size is over lets say 30kb then split the file to one file of 30kb and the rest in another file.

    And if its 300kb the new text file then split it to 10 files each of 30kb. Allways the first file 30kb and rest as much as needded.

    I also want that it will make tha for example splitted file 000001.txt will contain the text from the beginning file 000002.txt will start from the end of the first file and file number 000003.txt will start from where 000002.txt ended.

    Then i want in the end im doing something with the files and i want in the end to merge them all back to one big file in the order of 000001 then merge to it 000002 into the end of 000001 and so on so in the end ill have a new text file back with all the text as it was in the beginning.

    Hi Danieli,

    - open a FileStream with the big file

    - repeatedly read the amount of bytes you want to have in the small files from the big file and

    - save it to a new file

    - watch for the end of the stream (usually the last small file will be samller than the 30KB).

    - name the small files so that you easily can loop over them to restore the big file

    - restore the big file by reading the small files in a loop and writing the bytes to the new big file.

    It's the same as a File-Part_program to split large files into smaller ones.

    Regards,

      Thorsten

     

     

    Saturday, October 15, 2011 2:11 AM
  • Thorsten that what did so far:

     

    private void boutRerivingText()
            {
                int countFiles = 0;
                byte[] a;
                string startTag = "<content>";
                string endTag = "</content>";
                int startTagWidth = startTag.Length;
                int endTagWidth = endTag.Length;
                index = 0;
                w = new StreamWriter(@"D:\Book of Unwritten Tales The Critter Chronicles Translated To English\boutRetrivedText.txt");
                while (true)
                {
                    index = f.IndexOf(startTag, index);
                    if (index == -1)
                    {
                        break;
                    }
                    // else more to do - index now is positioned at first character of startTag 
                    int start = index + startTagWidth;
                    index = f.IndexOf(endTag, start + 1);
                    if (index == -1)
                    {
                        break;
                    }
                    // found the endTag 
                    string g = f.Substring(start, index - start);
                    w.WriteLine(g);
                }
                w.Close();
    
                splittedFiles = @"d:\splittedFiles.txt";
                StreamWriter writeBytes = new StreamWriter(splittedFiles);
                a = File.ReadAllBytes(retrivedTextFile);
                for (int i = 0; i < a.Length; i++)
                {
                    if (a[i] <= 30)
                    {
                        w.WriteLine(retrivedTextFile);
                    }
                    else
                    {
                        countFiles = countFiles + 1;
                        string t = retrivedTextFile + countFiles.ToString("D6") + ".txt";
                        w.WriteLine(t);
                    }
                }
            }
    


    In the end i added the part of the bytes but im not sure if the loop of the bytes should be inside the While(true) loop.

    And i dont know how ot make the checkings inside the bytes reading loop since i checked once if its <= 30 write it once but then if its not i want it to keep writing smaller files.

    And im not sure if to use the w for writing the text or the writeBytes since im reading the big text file bytes.

    w is streamWriter to write the text to a new text file the text i retrived.


    danieli
    Saturday, October 15, 2011 4:40 AM
  • Maybe i can use in the above code sample the boutRetrivingText() function maybe i can use the string g there and before writing all the text in g to a new file as im doing now: w.WriteLine(g); then do it there in real time the bytes calculation and decide if to WriteLine all the text in g to one file of 30kb or less then 30kb or to WriteLine  the text in g to many smaller files each will be 30kb as needed.

     

    I prefer if its possible to do it in real time using the string g.

    But im not sure how to do it im stuck.


    danieli

    • Edited by chocolade Saturday, October 15, 2011 4:47 AM
    Saturday, October 15, 2011 4:45 AM
  • ... something to start with.

    Note: this is more or less air code, its written in a rush (for I must do some other things now out of the house...) and not really tested, so there may be better ways to do this and there surely will be a better error-handling be possible:

     

        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                string largeFile = @"C:\Users\...\Desktop\a.txt";
                string savePath = @"C:\Users\...\Desktop\SplittedFiles";
                bool b = SplitFiles(largeFile, 50, savePath);
            } 
            
            private void button2_Click(object sender, EventArgs e)
            {
                string savePath = @"C:\Users\...\Desktop\SplittedFiles";
                string newLargeFile = @"C:\Users\...\Desktop\SplittedFiles\AAAA.txt";
                bool b = CombineFiles(newLargeFile, savePath);
            }
    
            private bool SplitFiles(string largeFile, int numLines, string savePath)
            {
                bool bRet = false;
                if (File.Exists(largeFile))
                {
                    StreamReader sr = null;
                    StreamWriter sw = null;
                    try
                    {
                        Directory.CreateDirectory(savePath);
    
                        sr = new StreamReader(largeFile); 
                        int i = 0;
    
                        while (sr.Peek() != -1)
                        {
                            sw = new StreamWriter(Path.Combine(savePath, "File" + i.ToString("D4") + ".txt"));
                            sw.AutoFlush = true;
    
                            for (int j = 0; j < numLines; j++)
                            {
                                sw.WriteLine(sr.ReadLine());
    
                                if (sr.Peek() == -1)
                                    break;
                            }
    
                            i++;
    
                            sw.Close();
                        }
    
                        bRet = true;
                    }
                    catch
                    {
                        bRet = false;
                    }
                    finally
                    {
                        sr.Close();
                        sr = null;
    
                        sw.Close();
                        sw = null;
                    }
                }
    
                return bRet;
            }
    
            private bool CombineFiles(string newLargeFile, string savePath)
            {
                bool bRet = false;
    
                if (Directory.Exists(savePath))
                {
                    StreamReader sr = null;
                    StreamWriter sw = null;
    
                    try
                    {
                        List<FileInfo> fList = new List<FileInfo>();
                        fList.AddRange(new DirectoryInfo(savePath).GetFiles("*.txt").Where(a => a.FullName.ToLower().Equals(newLargeFile.ToLower()) == false).ToArray());
                        fList = fList.OrderBy(a => a.Name).ToList();
    
                        sw = new StreamWriter(newLargeFile);
                        sw.AutoFlush = true;
    
                        foreach (FileInfo fi in fList)
                        {
                            sr = new StreamReader(fi.FullName);
                            sw.Write(sr.ReadToEnd());
                            sr.Close();
                        }
                    }
                    catch
                    {
                        bRet = false;
                    }
                    finally
                    {
                        sr.Close();
                        sr = null;
    
                        sw.Close();
                        sw = null;
                    }
                }
    
                return bRet;
            }
        }

     

    Regards,  

      Thorsten



    Saturday, October 15, 2011 5:26 AM
  • ... if you use text-files of foreign languages, you will probably need to use an encoding with the streamreaders and streamwriters.

    http://msdn.microsoft.com/en-us/library/x8xxf0x5.aspx

    Regards,

      Thorsten

    Saturday, October 15, 2011 5:35 AM
  • The code is working almost perfect i tested only the split code the SplitFiles.

    I took a 520kb text file and now i have 16 files the last one is 0kb

    The first one is 34kb then all the rest 33kb and number 15 is 37kb

     

    Now i edited the files and there is a problem with the last file wich is 15 the 37kb file. ( file 16 is the last one but its 0kb so its empty )

    The last file number 15 is ending like this:

     

     

    <xs:element name="ID" type="xs:string" msdata:targetNamespace="" minOccurs="0" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="tmpDataSet" msdata:IsDataSet="true" msdata:MainDataTable="Table1" msdata:UseCurrentLocale="true">
        <xs:complexType>
          <xs:choice minOccurs="0" maxOccurs="unbounded" />
        </xs:complexType>
      </xs:element>
    </xs:schema>�  �<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
      <tmpDataSet>
        <Table1 diffgr:id="Table11" msdata:rowOrder="0" diffgr:hasChanges="inserted">
          <Iactor>char_ghost_lawyer</Iactor>
          <Translation>Mr. Were</Translation>
          <Text>Hmm smells not badly, but you do not have a cirque-red and the following à ¼r micht please... grr.</Text>
          <ID>GENDENY_CHAR_GHOST_LAWYER_ITEM_MUSHROOM</ID>
        </Table1>
      </tmpDataSet>
    </diffgr:diffgram>c      d  2          ��������g  2          ��������k  2          ��������n  2          ��������q      r  2          ��������u  2          ��������y  2          ��������|  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������      �  2          ���������  2          ���������  2          ���������  2          ���������      �  2          ��������  2          ��������  2          ��������  2          ��������   2          ��������  2          ��������  2          ��������  2          ��������  2          ��������  2          ��������!  2          ��������$  2          ��������(  2          ��������+  2          ��������/  2          ��������2  2          ��������6  2          ��������9  2          ��������=  2          ��������@  2          ��������D  2          ��������G  2          ��������K  2          ��������N  2          ��������R  2          ��������U  2          ��������Y  2          ��������\  2          ��������`  2          ��������c  2          ��������g  2          ��������j  2          ��������n  2          ��������q  2          ��������u  2          ��������x  2          ��������|  2          ��������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������      �  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ��������  2          ��������  2          ��������  2          ��������   2          ��������  2          ��������  2          ��������  2          ��������  2          ��������  2          ��������   2          ��������$  2          ��������'  2          ��������+  2          ��������.  2          ��������2  2          ��������5  2          ��������9  2          ��������<  2          ��������@  2          ��������C  2          ��������G  2          ��������J  2          ��������N  2          ��������Q  2          ��������U  2          ��������X  2          ��������\  2          ��������_  2          ��������c  2          ��������f  2          ��������j  2          ��������m  2          ��������q  2          ��������t  2          ��������x  2          ��������{  2          ��������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������      �  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������      �  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ��������   2          ��������  2          ��������  2          ��������   2          ��������  2          ��������  2          ��������  2          ��������        2          ��������  2          ��������   2          ��������#  2          ��������&      '  2          ��������*  2          ��������-      .  2          ��������1  2          ��������4      5  2          ��������8  2          ��������;      <  2          ��������?  2          ��������B      C  2          ��������F  2          ��������J  2          ��������M  2          ��������Q  2          ��������T  2          ��������X  2          ��������[  2          ��������^      _  2          ��������b  2          ��������f  2          ��������i  2          ��������m  2          ��������p  2          ��������t  2          ��������w  2          ��������{  2          ��������~  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          �������� <xs:complexType>
          <xs:choice minOccurs="0" maxOccurs="unbounded" />
        </xs:complexType>
      </xs:element>
    </xs:schema>�  �<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
      <tmpDataSet>
        <Table1 diffgr:id="Table11" msdata:rowOrder="0" diffgr:hasChanges="inserted">
          <Iactor>char_borat</Iactor>
          <Translation>Borat</Translation>
          <Text>I do not want to buy this certainly, this is too awkward to me</Text>
          <ID>GENDENY_CHAR_BORAT_ITEM_GOLD_TOOTH</ID>
        </Table1>
      </tmpDataSet>
    </diffgr:diffgram>1         �          2         �          3         �  �  �<?xml version="1.0" encoding="utf-16"?>
    <xs:schema xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">

     

     

    While the original big file ending like this:

     

     

    <xs:element name="ID" type="xs:string" msdata:targetNamespace="" minOccurs="0" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="tmpDataSet" msdata:IsDataSet="true" msdata:MainDataTable="Table1" msdata:UseCurrentLocale="true">
        <xs:complexType>
          <xs:choice minOccurs="0" maxOccurs="unbounded" />
        </xs:complexType>
      </xs:element>
    </xs:schema>�  �<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
      <tmpDataSet>
        <Table1 diffgr:id="Table11" msdata:rowOrder="0" diffgr:hasChanges="inserted">
          <Iactor>char_ghost_lawyer</Iactor>
          <Translation>Mr. Were</Translation>
          <Text>Hmm smells not badly, but you do not have a cirque-red and the following à ¼r micht please... grr.</Text>
          <ID>GENDENY_CHAR_GHOST_LAWYER_ITEM_MUSHROOM</ID>
        </Table1>
      </tmpDataSet>
    </diffgr:diffgram>c      d  2          ��������g  2          ��������k  2          ��������n  2          ��������q      r  2          ��������u  2          ��������y  2          ��������|  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������      �  2          ���������  2          ���������  2          ���������  2          ���������      �  2          ��������  2          ��������  2          ��������  2          ��������   2          ��������  2          ��������  2          ��������  2          ��������  2          ��������  2          ��������!  2          ��������$  2          ��������(  2          ��������+  2          ��������/  2          ��������2  2          ��������6  2          ��������9  2          ��������=  2          ��������@  2          ��������D  2          ��������G  2          ��������K  2          ��������N  2          ��������R  2          ��������U  2          ��������Y  2          ��������\  2          ��������`  2          ��������c  2          ��������g  2          ��������j  2          ��������n  2          ��������q  2          ��������u  2          ��������x  2          ��������|  2          ��������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������      �  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ��������  2          ��������  2          ��������  2          ��������   2          ��������  2          ��������  2          ��������  2          ��������  2          ��������  2          ��������   2          ��������$  2          ��������'  2          ��������+  2          ��������.  2          ��������2  2          ��������5  2          ��������9  2          ��������<  2          ��������@  2          ��������C  2          ��������G  2          ��������J  2          ��������N  2          ��������Q  2          ��������U  2          ��������X  2          ��������\  2          ��������_  2          ��������c  2          ��������f  2          ��������j  2          ��������m  2          ��������q  2          ��������t  2          ��������x  2          ��������{  2          ��������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������      �  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������      �  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ��������   2          ��������  2          ��������  2          ��������   2          ��������  2          ��������  2          ��������  2          ��������        2          ��������  2          ��������   2          ��������#  2          ��������&      '  2          ��������*  2          ��������-      .  2          ��������1  2          ��������4      5  2          ��������8  2          ��������;      <  2          ��������?  2          ��������B      C  2          ��������F  2          ��������J  2          ��������M  2          ��������Q  2          ��������T  2          ��������X  2          ��������[  2          ��������^      _  2          ��������b  2          ��������f  2          ��������i  2          ��������m  2          ��������p  2          ��������t  2          ��������w  2          ��������{  2          ��������~  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ���������  2          ��������

     

     

    I know they are not proper txt files so maybe thats the problem why the large file ending like this and the last splitted file ending other way.

     

     

     


    danieli
    Saturday, October 15, 2011 7:16 AM
  • Hi,

    you mean the other way round, do you? The original file ends with the closing tags while the new one ends in the middle of the file..?


    Saturday, October 15, 2011 7:23 AM
  • What you could do is to split the file into small ones, combine the small ones to a new large one and check with fc, if they are different.
    Saturday, October 15, 2011 7:38 AM
  • The code is working almost perfect i tested only the split code the SplitFiles.

    I took a 520kb text file and now i have 16 files the last one is 0kb

    The first one is 34kb then all the rest 33kb and number 15 is 37kb

    This cannot be correct. All files (except the last one) should be of the same size (32KB)
    Saturday, October 15, 2011 7:40 AM
  • The code is working almost perfect i tested only the split code the SplitFiles.

    I took a 520kb text file and now i have 16 files the last one is 0kb

    The first one is 34kb then all the rest 33kb and number 15 is 37kb

    This cannot be correct. All files (except the last one) should be of the same size (32KB)
    here : http://imageshack.us/photo/my-images/213/splitted.jpg/  watch there the last two files.

    danieli
    Saturday, October 15, 2011 7:53 AM
  • Hi,

    you mean the other way round, do you? The original file ends with the closing tags while the new one ends in the middle of the file..?


    Yes thats what i mean. True.

    danieli
    Saturday, October 15, 2011 7:53 AM
  • ... I'm mixing chars and bytes... I will do some changes and tests...
    Saturday, October 15, 2011 7:56 AM
  • Hi Danieli,
    I edited my above post (with the code). I use a line based way now, so now the files will be of different sizes.
    Here's the changed method:
            private void button1_Click(object sender, EventArgs e)
            {
                string largeFile = @"C:\Users\...\Documents\TGBildbetrachter\Bildbetrachter\tools\ImageFunctions.cs";
                string savePath = @"C:\Users\...\Desktop\SplittedFiles";
                bool b = SplitFiles(largeFile, 100, savePath);
            } 
    
            private bool SplitFiles(string largeFile, int numLines, string savePath)
            {
                bool bRet = false;
                if (File.Exists(largeFile))
                {
                    StreamReader sr = null;
                    StreamWriter sw = null;
                    try
                    {
                        Directory.CreateDirectory(savePath);
    
                        sr = new StreamReader(largeFile); 
                        int i = 0;
    
                        while (sr.Peek() != -1)
                        {
                            sw = new StreamWriter(Path.Combine(savePath, "File" + i.ToString("D4") + ".txt"));
                            sw.AutoFlush = true;
    
                            for (int j = 0; j < numLines; j++)
                            {
                                sw.WriteLine(sr.ReadLine());
    
                                if (sr.Peek() == -1)
                                    break;
                            }
    
                            i++;
    
                            sw.Close();
                        }
    
                        bRet = true;
                    }
                    catch
                    {
                        bRet = false;
                    }
                    finally
                    {
                        sr.Close();
                        sr = null;
    
                        sw.Close();
                        sw = null;
                    }
                }
    
                return bRet;
            }
    
    Regards,
      Thorsten
    Saturday, October 15, 2011 9:39 AM
  • ... and here's a size-based method that first reads the complete file:

            private void button1_Click(object sender, EventArgs e)
            {
                string largeFile = @"C:\Users\...\Desktop\a.txt";
                string savePath = @"C:\Users\...\Desktop\SplittedFiles";
                bool b = SplitFiles(largeFile, 1024 * 16, savePath);
            } 
    
            private bool SplitFiles(string largeFile, int preferredSize, string savePath)
            {
                bool bRet = false;
                if (File.Exists(largeFile))
                {
                    StreamReader sr = null;
                    StreamWriter sw = null;
                    try
                    {
                        Directory.CreateDirectory(savePath);
    
                        sr = new StreamReader(largeFile); 
                        char[] allchars = sr.ReadToEnd().ToCharArray();
                        sr.Close();
    
                        int i = 0;
                        int position = 0;
    
                        while (position < allchars.Length)
                        {
                            int l = Math.Min(preferredSize, allchars.Length - position);
                            sw = new StreamWriter(Path.Combine(savePath, "File" + i.ToString("D4") + ".txt"));
                            sw.AutoFlush = true;
    
                            char[] buffer = new Char[l];
                            Array.Copy(allchars, position, buffer, 0, l);
                            sw.Write(buffer);
    
                            position += l;
    
                            i++;
    
                            sw.Close();
    
                            bRet = true;
                        }
                    }
                    catch
                    {
                        bRet = false;
                    }
                    finally
                    {
                        sr.Close();
                        sr = null;
    
                        sw.Close();
                        sw = null;
                    }
                }
    
                return bRet;
            }
    

    Regards,

      Thorsten

    • Marked as answer by chocolade Saturday, October 15, 2011 10:20 AM
    Saturday, October 15, 2011 9:55 AM
  • Note that I also changed the Combine-Method in my reply a couple of posts above.

    Regards,

      Thorsten

    Saturday, October 15, 2011 10:29 AM