[.NET]讀TXT檔改變內容方向,從最後列、最後行,以列方式讀取

[.NET]讀TXT檔改變內容方向,從最後列、最後行,以列方式讀取

今天看到朋友問「讀TXT檔改變內容方向」,還蠻好玩的,所以記錄一下。

題目如下,

假設檔案內容是
AAAA
BBBB
CCCC

要讓這個內容變成
CBA
CBA
CBA
CBA

 

直覺想法是先把全部的資料讀出後,再看各資料那一行的長度最長,然後由那個最大的長度,由後往前取字串來組。

因為有可能長度不一,所以取的過程有可能會有錯誤,那就把Exception給吃掉。程式如下,


string[] lines = System.IO.File.ReadAllLines(@"f:\t.txt");
int linesCount = lines.Count();
StringBuilder result = new StringBuilder();
//取出最長的一筆資料
//使用LINQ
//var maxLen = (from line in lines
//             select line.Length).Max();

//使用迴圈來取
int maxLen = 0;
for (int j = 0; j < linesCount; j++)
{
    if (maxLen < lines[j].Length)
        maxLen = lines[j].Length;
}

for (int i = 1; i <= maxLen; i++)
{
    string revertLine = string.Empty;
    for (int j = 1; j <= linesCount; j++)
    {
        try{
            revertLine += lines[linesCount - j][maxLen - i];
        }catch(Exception ){

        }
        
    }
    result.Append(revertLine + "\r\n");
    
}
MessageBox.Show(result.ToString());

 

或是將各字串都補成一樣長,使用PadLeft or PadRight,這樣就不用把錯誤給吃掉了。如下,

使用string.PadLeft


string[] lines = System.IO.File.ReadAllLines(@"f:\t.txt");
int linesCount = lines.Count();
StringBuilder result = new StringBuilder();
//取出最長的一筆資料
//使用LINQ
//var maxLen = (from line in lines
//             select line.Length).Max();

//使用迴圈來取
int maxLen = 0;
for (int j = 0; j < linesCount; j++)
{
    if (maxLen < lines[j].Length)
        maxLen = lines[j].Length;
}

//將所有列的資料都補成一樣長
for (int j = 0; j < linesCount; j++)
{
    if (maxLen > lines[j].Length)
        lines[j] = lines[j].PadLeft(maxLen);
}

for (int i = 1; i <= maxLen; i++)
{
    string revertLine = string.Empty;
    for (int j = 1; j <= linesCount; j++)
    {
        revertLine += lines[linesCount - j][maxLen - i];
    }
    result.Append(revertLine + "\r\n");
    
}
MessageBox.Show(result.ToString());

 

使用string.PadRight


string[] lines = System.IO.File.ReadAllLines(@"f:\t.txt");
int linesCount = lines.Count();
StringBuilder result = new StringBuilder();
//取出最長的一筆資料
//使用LINQ
var maxLen = (from line in lines
              select line.Length).Max();

//使用迴圈來取
//int maxLen = 0;
//for (int j = 0; j < linesCount; j++)
//{
//    if (maxLen < lines[j].Length)
//        maxLen = lines[j].Length;
//}

//將所有列的資料都補成一樣長
for (int j = 0; j < linesCount; j++)
{
    if (maxLen > lines[j].Length)
        lines[j] = lines[j].PadRight(maxLen);
}

for (int i = 1; i <= maxLen; i++)
{
    string revertLine = string.Empty;
    for (int j = 1; j <= linesCount; j++)
    {
        revertLine += lines[linesCount - j][maxLen - i];
    }
    result.Append(revertLine + "\r\n");
    
}
MessageBox.Show(result.ToString());

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^